RapidVideoMaker
Buat akun

API RapidVideoMaker

The REST API lets you process video files from any HTTP client — Python scripts, n8n workflows, third-party tools. Five modes available: Merge videos (multiple MP4), Edit audio (1 MP4 + 1 MP3), Create a video (1 JPG/PNG + 1 MP3), Overlay video (2 MP4 picture-in-picture). Processing is asynchronous: submit files, then poll for the result.

Dapatkan token API Anda secara gratis
Buat akun untuk mendapatkan token API — 20 permintaan per hari disertakan, dapat digunakan dari antarmuka atau API.
Buat akun gratis Sudah punya akun? Masuk

Alur kerja lengkap

Setiap integrasi mengikuti urutan 4 langkah yang sama:

1
Buat pekerjaan — POST /api/v1/render.php
Kirim file Anda sebagai multipart/form-data dengan token Bearer. 1 gambar JPG/PNG + 1 MP3 + mode=image_to_video → pembuatan video. 1 MP4 + 1 MP3 → edit audio. Beberapa MP4 → gabungan. Server mengembalikan job_id yang unik.
2
Tunggu pekerjaan — GET /api/v1/jobs.php?job_id=…
Polling endpoint ini secara berkala (setiap 5–10 detik). Pekerjaan melalui queuedprocessingready (atau error).
3
Ambil URL unduhan
Saat status ready, respons berisi field download_url yang siap digunakan.
4
Unduh file — GET /api/download.php?job_id=…
Unduh MP4 akhir. File tersedia selama 2 jam setelah pekerjaan selesai, kemudian dihapus otomatis.

Autentikasi

Setiap permintaan harus menyertakan token API Anda. Dua format diterima:

# Autentikasi — Setiap permintaan harus menyertakan token API Anda. Dua format diterima: Authorization: Bearer rvm_your_token_here # Alternative X-API-Key: rvm_your_token_here

Token Anda tersedia di area anggotasatu token per akun, dibuat otomatis saat registrasi.

Kuota

Setiap akun anggota memiliki 20 permintaan per hari, dibagi antara antarmuka web dan API. Pekerjaan yang gagal tidak menggunakan kuota. Penghitung direset tengah malam UTC.

Respons POST menyertakan quota_used dan quota_remaining. Saat batas terlampaui, server merespons 429.

Antarmuka + API = penghitung yang sama. Video yang dibuat dari antarmuka web dan permintaan API masing-masing menggunakan 1 kredit dari kuota harian yang sama.

Antrian

Satu pekerjaan diproses dalam satu waktu. Jika beberapa pekerjaan dikirim secara bersamaan, mereka diantrekan dan diproses secara berurutan. Saat menunggu, respons status menyertakan:

Batas kecepatan diterapkan: endpoint /api/v1/jobs.php menerima maksimal 12 panggilan per menit per token. Rekomendasi: 10 detik antar panggilan.

Transisi yang tersedia

Sertakan transition_type=none (default) untuk penggabungan langsung, atau salah satu jenis di bawah ini untuk fade antar klip:

none fade fadeblack dissolve wipeleft wiperight slideleft slideright zoomin circleclose

Durasi (transition_duration) antara 0.2 dan 2.0 detik.

Endpoint

POST /api/v1/render.php Membuat pekerjaan pemrosesan video

Five modes, accessible via the mode field (omit mode with multiple MP4s to auto-detect fusion):

PenggunaanMode APIFile yang diperlukanDeskripsi
Gabungkan video fusion 2–20 file MP4 Klip dirakit secara berurutan sesuai urutan yang diberikan. Transisi opsional antar klip.
Edit audio add_audio atau mix_audio 1 MP4 + 1 MP3 Mengganti atau memperkaya trek audio video. Trek video tidak pernah di-re-encode.

add_audio — audio asli dihapus dan diganti sepenuhnya oleh MP3.
mix_audio — audio asli dipertahankan dan MP3 ditumpangkan.
Buat video image_to_video 1 JPG/PNG + 1 MP3 Menghasilkan video dari gambar diam dan file audio. Overlay teks, fade, resolusi, dan fps dapat dikonfigurasi melalui field options.
Overlay video overlay_video 2 MP4 Menempatkan video kedua di atas video utama. Posisi, ukuran, opasitas, dan audio dapat dikonfigurasi melalui kolom options.
Teks ke MP3 text_to_mp3 (hanya teks) Mengonversi teks menjadi suara dan mengembalikan file MP3. Tidak perlu unggah file — kirim mode=text_to_mp3, text dan lang sebagai field formulir. Mendukung semua 20 bahasa situs.
Validasi ketat: setiap mode memerlukan jumlah dan jenis file yang tepat. add_audio dan mix_audio hanya menerima 1 MP4 + 1 MP3. image_to_video hanya menerima 1 JPG/PNG + 1 MP3.
Aturan durasi: dalam mode audio dan image_to_video, durasi hasil terkunci pada durasi MP3.

Parameter umum (multipart/form-data)

FieldTipeWajibDeskripsi
videos[]File[]YAFile yang akan diproses. Tergantung mode: 2–20 MP4, atau 1 MP4 + 1 MP3, atau 1 gambar (JPG/PNG) + 1 MP3. Maks 500 MB per file.
modestring*image_to_video | add_audio | mix_audio. Wajib untuk ketiga mode ini. Diabaikan hanya jika semua file adalah MP4 (fusion).
orderJSONHanya mode fusion — array JSON indeks yang mendefinisikan urutan klip.
transition_typestringHanya mode fusion. Default: none.
transition_durationfloatHanya mode fusion. Durasi 0.2–2.0 detik. Default: 0.5.
optionsJSONHanya mode image_to_video — objek JSON parameter render.
callback_urlstringURL publik (http/https) yang dipanggil saat pekerjaan selesai. Respons menyertakan webhook_secret.

Parameter options — mode image_to_video

Semua opsional. Nilai yang tidak disediakan → default yang diterapkan oleh worker.

KunciTipeDefaultDeskripsi
textstring""Teks yang ditampilkan sebagai overlay. Kosong = tanpa teks. Maks 500 karakter.
font_sizeint60Ukuran font dalam piksel. Rentang: 10–300.
text_colorstring"white"Warna teks (mis. white, yellow, #ffffff).
text_positionstring"center"Posisi teks: center, top, bottom.
boxbooltrueLatar belakang semi-transparan di belakang teks.
box_colorstring"black@0.4"Warna + opasitas dalam format FFmpeg: color@opacity.
fade_durationfloat0.5Durasi fade in/out dalam detik (0–2). 0 = tanpa efek.
widthint1080Lebar video dalam piksel (64–3840, dipaksa genap).
heightint1920Tinggi video dalam piksel (64–3840, dipaksa genap).
fpsint24Frame rate (1–60).
image_fitstring"contain"Mode pembingkaian: contain = gambar penuh terlihat; cover = diperbesar untuk mengisi seluruh bingkai.
bg_colorstring"black"Warna latar belakang jika gambar tidak mengisi resolusi target.
enable_image_motionboolfalseMengaktifkan animasi foto. Jika false, gambar tetap statis.
image_motion_effectstring"ken_burns"Efek animasi. Nilai yang diterima: zoom_in, zoom_out, pan_left_to_right, pan_right_to_left, ken_burns, dll.
motion_intensityfloat1.0Intensitas animasi foto (0.25–2.0). Mengalikan amplitudo zoom dan kecepatan pan.
text_effectstring"none"Animasi overlay teks. Nilai yang diterima: none, fade_in, slide_up, slide_down, slide_left, bounce.
text_effect_intensityfloat1.0Intensitas animasi teks (0.25–2.0). Diabaikan jika text_effect adalah none.
text_border_widthint0Ketebalan garis hitam di sekitar karakter dalam piksel (0 = dinonaktifkan).
text_modestring"static"Mode tampilan teks. static (default): teks penuh terlihat dari frame pertama. word_by_word: kata-kata muncul satu per satu dengan kecepatan word_reveal_speed. Tidak bisa digunakan dengan text_effect: jika text_mode=word_by_word, text_effect diabaikan.
word_reveal_speedfloat1.5Kecepatan pengungkapan kata per detik (0.3–5.0, default 1.5). Hanya dengan text_mode=word_by_word. Nilai yang direkomendasikan untuk sinkronisasi OpenAI TTS: 2.0.
word_animstring"none"Animasi kemunculan setiap kata. none (default): tampil langsung. fade: setiap kata baru muncul dengan fade 0.2s dan crossfade ke blok sebelumnya. Hanya dengan text_mode=word_by_word.

Parameter options — mode overlay_video

Semua opsional. Urutan unggahan penting: file pertama adalah video utama (latar belakang), file kedua adalah overlay (latar depan). Gunakan chroma_key untuk menghapus latar hijau dari overlay.

KunciTipeDefaultDeskripsi
positionstring"bottom-right"Sudut penempatan overlay: top-left, top-right, bottom-left, bottom-right, atau center.
scalefloat0.30Ukuran overlay sebagai pecahan dari lebar video utama. 0.25 = 25% dari lebar. Rentang: 0.05–1.0.
opacityfloat1.0Transparansi overlay. 1.0 = sepenuhnya terlihat, 0.0 = tak terlihat.
marginint10Jarak dalam piksel antara overlay dan tepi bingkai. Diabaikan jika position=center. Rentang: 0–200.
audiostring"main"Audio yang dipertahankan. main: hanya audio video utama. overlay: hanya audio overlay. mix: kedua trek dicampur.
chroma_keyboolfalseAtur ke true untuk menghapus latar hijau murni (#00FF00) dari overlay — berguna untuk webcam atau animasi yang difilmkan di latar hijau.
chroma_similarityfloat0.20Toleransi chroma key. Rendah = kecocokan ketat. Tinggi = penghapusan lebih luas. Disarankan: 0.10–0.20 untuk hijau digital, 0.25–0.45 untuk layar fisik. Rentang: 0.01–0.60.

Parameter options — Edit audio (mix_audio)

Hanya tersedia dengan mode=mix_audio. Diabaikan untuk add_audio.

KunciTipeDefaultDeskripsi
mp3_volumefloat1.0Volume MP3 yang ditumpangkan (0.0 = bisu, 1.0 = volume asli, 2.0 = ganda).

Respons sukses (HTTP 200)

{ "success": true, "job_id": "a3f1c8d2e5b09471...", "mode": "fusion", // "fusion" | "add_audio" | "mix_audio" | "image_to_video" | "overlay_video" "file_count": 2, "transition": null, "quota_used": 1, "quota_remaining": 9, "status_url": "https://rapidvideomaker.com/api/v1/jobs.php?job_id=a3f1c8..." }

Contoh curl — mode 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" # 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 — black outline around characters (0 = disabled) # 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)

Contoh curl — Edit audio

# 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)

Contoh curl — mode 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)

Contoh curl — Gabungkan video

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"
GET /api/v1/jobs.php?job_id=<hex32> Status pekerjaan

Status yang mungkin

StatusMaknaField tambahan
queued Dalam antrian, belum diproses queue_position, queue_total, eta_minutes
processing Pemrosesan FFmpeg sedang berlangsung
ready Selesai — file tersedia download_url, created_at, expires_at
error Pemrosesan gagal error (message)

Respons berdasarkan status

{ "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" }

Contoh curl

curl -H "Authorization: Bearer rvm_your_token" \ "https://rapidvideomaker.com/api/v1/jobs.php?job_id=a3f1c8..."
GET /api/v1/jobs.php List all jobs created with this token (paginated, sorted by date desc)

Parameter umum (multipart/form-data)

apidocs_th_paramTipeDefaultapidocs_th_desc
pageinteger1Page number (starts at 1)
limitinteger20Results per page (max 50, default 20)

Respons berdasarkan status

{ "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 }
POST /api/v1/publish.php Publikasikan video ke YouTube atau TikTok

Mempublikasikan job yang selesai (status=ready) ke satu atau lebih akun sosial. Token harus milik akun anggota (bukan token admin).

Prasyarat: Akun sosial (YouTube, TikTok) harus terlebih dahulu dihubungkan melalui OAuth di halaman Publikasi area anggota sebelum menggunakan endpoint ini. account_id setiap akun ditampilkan di sana.

Parameter umum (multipart/form-data)

apidocs_th_paramTipeapidocs_th_requiredapidocs_th_desc
job_idstringapidocs_requiredID job (hex 32 karakter) dari video yang selesai
publicationsarrayapidocs_requiredArray objek publikasi (maks. 10)

Objek publikasi

apidocs_th_paramTipeapidocs_th_requiredapidocs_th_desc
account_idintegerapidocs_requiredID akun sosial yang terhubung — temukan di halaman Publikasi area anggota
titlestringJudul video (maks. 512 karakter)
descriptionstringDeskripsi video (maks. 5 000 karakter)
tagsstringTag dipisahkan koma (maks. 1 024 karakter)
visibilitystringpublic | private | unlisted — Default: public
tiktok_modestringdraft | direct — Hanya TikTok — default: direct
tiktok_privacystringmode directHanya TikTok — wajib di mode direct
allow_commentbooleanHanya TikTok — izinkan komentar
allow_duetbooleanHanya TikTok — izinkan duet
allow_stitchbooleanHanya TikTok — izinkan stitch
your_brandbooleanHanya TikTok — konten promosi organik ("Merek Anda").
branded_contentbooleanHanya TikTok — pengungkapan konten bermerek
tiktok_cover_msintegerHanya TikTok — stempel waktu frame sampul dalam ms (0–60 000, default 1 000)

Respons berdasarkan status

{ "success": true, "results": [ { "account_id": 12, "pub_id": 47, "status": "published", "provider": "youtube", "url": "https://youtu.be/abc123" } ] }

Kode kesalahan per publikasi

apidocs_th_codeMakna
job_not_readyJob belum selesai
mode_not_supportedJob text_to_mp3 tidak dapat dipublikasikan
account_not_foundAkun tidak ditemukan atau terputus
tiktok_privacy_requiredTingkat privasi diperlukan di mode direct
publication_failedProvider mengembalikan kesalahan saat upload

Contoh cURL

curl -X POST https://rapidvideomaker.com/api/v1/publish.php \ -H "Authorization: Bearer rvm_your_token" \ -H "Content-Type: application/json" \ -d '{ "job_id": "a3f1c8...", "publications": [ { "account_id": 12, "title": "My video", "description": "Created with RapidVideoMaker", "visibility": "public" } ] }'
GET /api/download.php?job_id=<hex32> Unduh file akhir

Mengembalikan file MP4 akhir sebagai stream (Content-Type: video/mp4). Tidak memerlukan token. Hanya tersedia saat status ready.

File disimpan selama 2 jam setelah pekerjaan selesai, kemudian dihapus. Unduh segera saat status menjadi ready.

Parameter opsional

ParameterDeskripsi
filenameNama yang disarankan untuk file yang diunduh (mis. video-saya.mp4)

Contoh curl

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

Webhook

Webhook adalah alternatif dari polling: daripada memeriksa status setiap X detik, Anda menyediakan URL dan server memanggil Anda secara otomatis saat pekerjaan selesai.

Cara kerjanya

  1. Sertakan callback_url dalam POST ke /api/v1/render.php
  2. Respons berisi webhook_secret — simpan untuk memverifikasi tanda tangan
  3. Saat pekerjaan mencapai ready atau error, server mengirim JSON POST yang ditandatangani ke URL Anda
  4. Verifikasi tanda tangan dengan HMAC-SHA256(webhook_secret, raw_body)
Batasan: callback_url harus URL yang dapat diakses publik (http atau https). Alamat IP pribadi, loopback, dan cadangan diblokir di sisi server. Batas waktu: 10 detik.

Payload yang diterima

{ "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" }

Header yang dikirim server

HeaderNilai
Content-Typeapplication/json
X-RVM-Signaturesha256=<hmac_hex> — tanda tangan HMAC-SHA256 dari body mentah
X-RVM-Job-Idjob_id yang relevan

Verifikasi tanda tangan

# 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()

Kode kesalahan

HTTPKode JSONPenyebab
401unauthorizedToken hilang, tidak valid, atau dicabut
400missing_filesTidak ada file yang diterima
400too_few_filesKurang dari 2 file dikirim
400too_many_filesLebih dari 20 file dikirim
400invalid_mimeFile tidak didukung — hanya MP4, MP3, dan JPG/PNG yang diterima
400wrong_file_countJumlah file tidak cocok dengan mode yang dipilih
400wrong_file_typesJenis file tidak cocok dengan mode yang dipilih
400invalid_file_combinationKombinasi file tanpa mode yang ditentukan tidak cocok dengan mode yang didukung
400invalid_optionsField options bukan JSON yang valid
400invalid_optionNilai dalam options tidak valid
400file_too_largeSebuah file melebihi 500 MB
400invalid_orderArray order bukan permutasi yang valid
400invalid_job_idFormat job_id salah (harus 32 karakter hex)
404job_not_foundPekerjaan tidak ditemukan — job_id tidak dikenal atau tidak pernah ada
410job_expiredPekerjaan kedaluwarsa — ada tetapi jendela pemulihan 2 jam telah berlalu
429quota_exceeded20 pekerjaan berhasil/hari tercapai
429rate_limitedLebih dari 12 panggilan/menit di /api/v1/jobs.php
500server_errorKesalahan server internal

Contoh integrasi

Contoh untuk setiap mode — instal requests dengan pip install requests.

Konfigurasi umum

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

Mode image_to_video — gambar + audio → 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" "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" }), }, )

Edit audio

# 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 )

Mode overlay_video — gambar dalam gambar

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 }), }, )

Gabungkan video

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"}, )

Polling + unduhan (umum untuk semua mode)

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")

Dua pendekatan di n8n: polling (loop status) atau webhook (server memanggil n8n). Webhook direkomendasikan.

Pendekatan A — Webhook (direkomendasikan)

Hanya 3 node, tanpa loop.

Node 1 — Pemicu Webhook
Tambahkan node Webhook sebagai input alur kerja (metode POST).

Node 2 — Buat pekerjaan (HTTP Request)

MetodePOST
URLhttps://rapidvideomaker.com/api/v1/render.php
AutentikasiHeader Auth — Authorization: Bearer rvm_…
Tipe Konten BodyForm-Data Multipart
Body paramsField biner videos[] untuk setiap klip + Field teks callback_url

Simpan webhook_secret dari respons dalam variabel alur kerja untuk memverifikasi tanda tangan.

Node 3 — Proses hasil (dalam alur kerja yang dipicu webhook)
Saat n8n menerima POST server, $json.status adalah ready atau error.

Untuk memverifikasi tanda tangan: bandingkan {{ $headers['x-rvm-signature'] }} dengan HMAC-SHA256 dari webhook_secret Anda.

Pendekatan B — Polling (tanpa webhook)

5 node, loop status setiap 10 detik.

Node 1 — Buat pekerjaan — konfigurasi yang sama tanpa callback_url.

Node 2 — Tunggu — 10 detik.

Node 3 — Poll status (HTTP Request GET)

URLhttps://rapidvideomaker.com/api/v1/jobs.php
Query paramsjob_id = {{ $('Node 1').item.json.job_id }}
AutentikasiHeader Auth — token yang sama

Node 4 — If: {{ $json.status }} === 'ready' → true: Node 5 / false: kembali ke Node 2.

Tambahkan penghitung iterasi di node Set untuk menghentikan loop setelah 60 percobaan.

Node 5 — Unduh: HTTP Request GET pada {{ $json.download_url }}.

Langkah 1 — Buat pekerjaan (pilih mode)

# 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"

Langkah 2 — Polling

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

Langkah 3 — Unduh

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

Praktik terbaik

File hasil disimpan 2 jam setelah pekerjaan selesai, kemudian dihapus otomatis.