RapidVideoMaker
Hesap oluştur

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/MOV), Edit audio (1 MP4/MOV + 1 MP3), Create a video (1 JPG/PNG + 1 MP3), Overlay video (2 MP4/MOV picture-in-picture). Processing is asynchronous: submit files, then poll for the result.

API jetonunuzu ücretsiz alın
API jetonunuzu almak için bir hesap oluşturun — günde 20 istek dahil, arayüzden veya API'den kullanılabilir.
Ücretsiz hesap oluştur Zaten hesabınız var mı? Giriş yapın

Tam iş akışı

Her entegrasyon aynı 4 adımlı diziyi izler:

1
İş oluştur — POST /api/v1/render.php
Dosyalarınızı Bearer token'ınızla multipart/form-data olarak gönderin. 1 JPG/PNG resim + 1 MP3 + mode=image_to_video → video oluşturma. 1 MP4/MOV + 1 MP3 → ses düzenleme (mode=mix_audio ekle). Birden fazla MP4/MOV → birleştirme. Sunucu benzersiz bir job_id döndürür.
2
İşi bekle — GET /api/v1/jobs.php?job_id=…
Bu uç noktayı düzenli aralıklarla (her 5–10 sn) sorgulayın. İş queuedprocessingready (veya error) aşamalarından geçer.
3
İndirme URL'ini al
Durum ready olduğunda yanıt, kullanıma hazır bir download_url alanı içerir.
4
Dosyayı indir — GET /api/download.php?job_id=…
Son MP4/MOV'ü indirin. Dosya iş tamamlandıktan 2 saat sonra otomatik olarak silinir.

Kimlik doğrulama

Her istek API token'ınızı içermelidir. İki format kabul edilir:

# Kimlik doğrulama — Her istek API token'ınızı içermelidir. İki format kabul edilir: Authorization: Bearer rvm_your_token_here # Alternative X-API-Key: rvm_your_token_here

Token'ınız üye alanında mevcuttur — hesap başına bir token, kayıtta otomatik oluşturulur. Yalnızca bir kez açık olarak gösterilir — güvende tutun.

Kota

Her üye hesabının, web arayüzü ve API arasında paylaşılan günde 20 isteği vardır. Başarısız işler kota tüketmez. Sayaç gece yarısı UTC'de sıfırlanır.

POST yanıtları quota_used ve quota_remaining içerir. Limit aşıldığında sunucu 429 ile yanıt verir.

Arayüz + API = aynı sayaç. Web arayüzünden oluşturulan bir video ve bir API isteği aynı günlük kotadan 1 kredi tüketir.

Kuyruk

Bir seferde bir iş işlenir. Birden fazla iş aynı anda gönderilirse kuyruğa alınır ve sırayla işlenir. Beklerken durum yanıtı şunları içerir:

Hız sınırı uygulandı: /api/v1/jobs.php uç noktası dakikada en fazla 12 çağrı kabul eder. Öneri: çağrılar arası 10 saniye.

Kullanılabilir geçişler

Doğrudan birleştirme için transition_type=none (varsayılan) geçirin, veya klipsler arasında solma için aşağıdaki türlerden birini kullanın:

none fade fadeblack dissolve wipeleft wiperight slideleft slideright zoomin circleclose

Süre (transition_duration) 0.2 ile 2.0 saniye arasındadır.

Uç noktalar

POST /api/v1/render.php Video işleme işi oluşturur

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

KullanımAPI ModuGerekli dosyalarAçıklama
Videoları birleştir fusion 2–20 MP4/MOV dosyası Klipsler sağlanan sırayla arka arkaya birleştirilir. Klipsler arasında isteğe bağlı geçişler.
Sesi düzenle add_audio veya mix_audio 1 MP4/MOV + 1 MP3 Videonun ses parçasını değiştirir veya zenginleştirir. Video parçası asla yeniden kodlanmaz.

add_audio — orijinal ses silinir ve tamamen MP3 ile değiştirilir.
mix_audio — orijinal ses korunur ve MP3 üzerine eklenir.
Video oluştur image_to_video 1 JPG/PNG + 1 MP3 Sabit bir görüntü ve ses dosyasından video oluşturur. Metin yerleşimi, solmalar, çözünürlük ve fps options alanı aracılığıyla yapılandırılabilir.
Overlay video overlay_video 2 MP4/MOV İkinci bir videoyu ana videonun üzerine yerleştirir. Konum, boyut, opaklık ve ses options alanı ile ayarlanabilir.
Metinden MP3 text_to_mp3 (yalnızca metin) Metni konuşmaya dönüştürür ve bir MP3 dosyası döndürür. Dosya yükleme gerekmez — mode=text_to_mp3, text ve lang alanlarını form olarak gönderin. Sitenin 20 dilini destekler.
Katı doğrulama: her mod için tam sayı ve dosya türü gerekir. add_audio ve mix_audio yalnızca 1 MP4/MOV + 1 MP3 kabul eder. image_to_video yalnızca 1 JPG/PNG + 1 MP3 kabul eder.
Süre kuralı: ses ve image_to_video modlarında sonuç süresi MP3 süresine kilitlenir.

Ortak parametreler (multipart/form-data)

AlanTürZor.Açıklama
videos[]File[]EVETİşlenecek dosyalar. Moda bağlı olarak: 2–20 MP4/MOV, veya 1 MP4/MOV + 1 MP3, veya 1 görüntü (JPG/PNG) + 1 MP3. Dosya başına max 500 MB.
modestring*image_to_video | add_audio | mix_audio | overlay_video | text_to_mp3. Bu fusion dışı modlar için zorunludur. Yalnızca MP4/MOV dosyalarıyla mode alanının atlanması her zaman fusion'ı tetikler (stream-copy birleştirme) — tam olarak 2 MP4/MOV yüklense bile asla overlay_video'yu değil. Ses düzenleme için: add_audio orijinali siler, mix_audio onu korur ve üzerine bindirir. mode alanı sağlanırsa, yüklenen dosyalar tam olarak eşleşmelidir — aksi takdirde istek reddedilir.
orderJSONYalnızca fusion modu — klip sırasını tanımlayan indeks JSON dizisi.
transition_typestringYalnızca fusion modu. Varsayılan: none.
transition_durationfloatYalnızca fusion modu. Süre 0.2–2.0 sn. Varsayılan: 0.5.
optionsJSONYalnızca image_to_video modu — render parametrelerinin JSON nesnesi.
callback_urlstringİş tamamlandığında çağrılan genel URL (http/https). Yanıt bir webhook_secret içerir.

options parametreleri — image_to_video modu

Tümü isteğe bağlı. Sağlanmayan değerler → worker tarafından uygulanan varsayılanlar.

AnahtarTürVarsayılanAçıklama
textstring""Yerleştirme olarak gösterilen metin. Boş = metin yok. Max 500 karakter.
font_sizeint60Piksel cinsinden yazı tipi boyutu. Aralık: 10–300.
text_colorstring"white"Metin rengi (ör. white, yellow, #ffffff).
text_positionstring"center"Metin konumu: center, top, bottom.
boxbooltrueMetnin arkasında yarı saydam arka plan.
box_colorstring"black@0.4"FFmpeg formatında renk + opaklık: color@opacity.
fade_durationfloat0.5Saniye cinsinden açılış/kapanış süresi (0–2). 0 = efekt yok.
widthint1080Piksel cinsinden video genişliği (64–3840, çift zorlanmış).
heightint1920Piksel cinsinden video yüksekliği (64–3840, çift zorlanmış).
fpsint24Kare hızı (1–60).
image_fitstring"contain"Çerçeveleme modu: contain = tam görüntü görünür; cover = tüm çerçeveyi doldurmak için yakınlaştırılmış.
bg_colorstring"black"Görüntü hedef çözünürlüğü doldurmadığında arka plan rengi.
enable_image_motionboolfalseFotoğraf animasyonunu etkinleştirir. false ise görüntü sabit kalır.
image_motion_effectstring"ken_burns"Animasyon efekti. Kabul edilen değerler: zoom_in, zoom_out, pan_left_to_right, pan_right_to_left, ken_burns vb.
motion_intensityfloat1.0Fotoğraf animasyon yoğunluğu (0.25–2.0). Yakınlaştırma genliğini ve kaydırma hızını çarpar.
text_effectstring"none"Metin katmanı animasyonu. Kabul edilen değerler: none, fade_in, slide_up, slide_down, slide_left, bounce.
text_effect_intensityfloat1.0Metin animasyon yoğunluğu (0.25–2.0). text_effect none ise yok sayılır.
text_border_widthint0Karakterlerin etrafındaki siyah dış çizginin kalınlığı piksel cinsinden (0 = devre dışı).
text_modestring"static"Metin görüntüleme modu. static (varsayılan): tam metin 1. kareden itibaren görünür. word_by_word: kelimeler word_reveal_speed hızında tek tek görünür. text_effect ile birlikte kullanılamaz: text_mode=word_by_word ise text_effect yok sayılır.
word_reveal_speedfloat1.5Saniyedeki kelime gösterme hızı (0.3–5.0, varsayılan 1.5). Yalnızca text_mode=word_by_word ile kullanılır. OpenAI TTS için önerilen değer: 2.0.
word_animstring"none"Her kelimenin görünüm animasyonu. none (varsayılan): anlık görünüm. fade: her yeni kelime 0.2s fade ile önceki bloktan geçişle görünür. Yalnızca text_mode=word_by_word ile kullanılır.

options parametreleri — overlay_video modu

Tümü isteğe bağlı. Yükleme sırası önemlidir: birinci dosya ana video (arka plan), ikinci dosya overlay (ön plan). Overlay'deki yeşil ekranı kaldırmak için chroma_key kullanın.

AnahtarTürVarsayılanAçıklama
positionstring"bottom-right"Overlay'in yerleştirileceği köşe: top-left, top-right, bottom-left, bottom-right veya center.
scalefloat0.30Ana video genişliğine oranla overlay boyutu. 0.25 = genişliğin %25'i. Aralık: 0.05–1.0.
opacityfloat1.0Overlay şeffaflığı. 1.0 = tamamen görünür, 0.0 = görünmez.
marginint10Overlay ile çerçeve kenarı arasındaki piksel boşluğu. position=center ise yok sayılır. Aralık: 0–200.
audiostring"main"Hangi sesin korunacağı. main: sadece ana video sesi. overlay: sadece overlay sesi. mix: her iki parça karışımı.
chroma_keyboolfalseOverlay'deki saf yeşil (#00FF00) arka planı kaldırmak için true olarak ayarla — yeşil ekranda çekilen webcam veya animasyonlar için kullanışlıdır.
chroma_similarityfloat0.20Yeşil ekran toleransı. Düşük = katı eşleşme. Yüksek = daha geniş kaldırma. Önerilen: dijital yeşil için 0.10–0.20, fiziksel ekran için 0.25–0.45. Aralık: 0.01–0.60.

options parametreleri — Ses düzenleme (mix_audio)

Yalnızca mode=mix_audio ile kullanılabilir. add_audio için yok sayılır.

AnahtarTürVarsayılanAçıklama
mp3_volumefloat1.0Eklenen MP3'ün ses seviyesi (0.0 = sessiz, 1.0 = orijinal, 2.0 = çift).

text_to_mp3 modu — doğrudan parametreler (options JSON'u yok)

Diğer modların aksine, bu alanlar options JSON nesnesi içinde değil, doğrudan form alanları olarak gönderilir. Sadece text zorunludur.

AnahtarTürVarsayılanAçıklama
textstringSese dönüştürülecek metin. Zorunlu. En fazla 5.000 karakter.
langstring"en"voice belirtilmediğinde veya geçersiz olduğunda varsayılan sesi seçmek için kullanılan dil kodu. Sitenin 20 dilinden biri (aşağıdaki tabloya bakın). Bilinmiyorsa en'e döner.
voicestringotomatikedge-tts ses kimliği (aşağıdaki tabloya bakın). Belirtilmemişse veya geçersizse, lang için otomatik olarak ilk ses kullanılır.
slowboolfalseKonuşmayı %25 yavaşlatmak için true (veya 1) olarak ayarlayın. Diğer tüm değerler false olarak kabul edilir.
Dosya yükleme gerekmez: diğer modların aksine, text_to_mp3 videos[] gerektirmez. mode=text_to_mp3text / lang / voice / slow ile birlikte normal form alanları olarak gönderin.

Kullanılabilir sesler (edge-tts, Microsoft Neural), dil koduna göre gruplandırılmıştır:

DilKullanılabilir sesler
en en-US-AvaNeural, en-US-AndrewNeural, en-GB-LibbyNeural
fr fr-FR-DeniseNeural, fr-FR-HenriNeural, fr-FR-EloiseNeural
es es-ES-ElviraNeural, es-ES-AlvaroNeural, es-MX-DaliaNeural
ar ar-SA-ZariyahNeural, ar-SA-HamedNeural, ar-EG-SalmaNeural
pt pt-BR-FranciscaNeural, pt-BR-AntonioNeural, pt-PT-RaquelNeural
de de-DE-KatjaNeural, de-DE-ConradNeural, de-DE-AmalaNeural
it it-IT-ElsaNeural, it-IT-DiegoNeural, it-IT-IsabellaNeural
nl nl-NL-ColetteNeural, nl-NL-MaartenNeural
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
ur ur-PK-UzmaNeural, ur-PK-AsadNeural
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

Başarılı yanıt (HTTP 200)

{ "success": true, "job_id": "a3f1c8d2e5b09471...", "mode": "fusion", // "fusion" | "add_audio" | "mix_audio" | "image_to_video" | "overlay_video" | "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 için yanıt, file_count veya transition alanları içermez (dosya yüklenmedi) — geri kalanı aynıdır: job_id, quota_used, quota_remaining, status_url, webhook_secret.

curl örneği — image_to_video modu

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)

curl örneği — Sesi düzenle

# 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 örneği — overlay_video modu

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 örneği — Videoları birleştir

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 örneği — text_to_mp3 modu

# 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> İş durumu

Olası durumlar

DurumAnlamEk alanlar
queued Kuyrukta, henüz işlenmedi queue_position, queue_total, eta_minutes
processing FFmpeg işlemi devam ediyor
ready Tamamlandı — dosya mevcut download_url, created_at, expires_at
error İşlem başarısız oldu error (message)

Duruma göre yanıtlar

{ "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 örneği

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)

Ortak parametreler (multipart/form-data)

ParametreTürVarsayılanAçıklama
pageinteger1Page number (starts at 1)
limitinteger20Results per page (max 50, default 20)

Duruma göre yanıtlar

{ "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 YouTube veya TikTok'a video yayınla

Bir veya daha fazla sosyal hesaba tamamlanmış bir job (status=ready) yayınlar. Token bir üye hesabına ait olmalıdır (yönetici token'ı değil).

Ön Koşul: Sosyal hesaplar (YouTube, TikTok) bu endpoint kullanılmadan önce üye alanındaki Yayınlar sayfasında OAuth ile bağlanmalıdır. Her hesabın account_id'si orada görüntülenir.

Ortak parametreler (multipart/form-data)

ParametreTürZorunluAçıklama
job_idstringEVETTamamlanan videonun job ID'si (hex 32 karakter)
publicationsarrayEVETYayın nesneleri dizisi (maks. 10)

Yayın nesnesi

ParametreTürZorunluAçıklama
account_idintegerEVETBağlı sosyal hesabın ID'si — üye alanındaki Yayınlar sayfasında görünür
titlestringVideo başlığı (maks. 512 karakter)
descriptionstringVideo açıklaması (maks. 5 000 karakter)
tagsstringVirgülle ayrılmış etiketler (maks. 1 024 karakter)
visibilitystringpublic | private | unlisted — Varsayılan: public
tiktok_modestringdraft | direct — Yalnızca TikTok — varsayılan: draft
tiktok_privacystringdirect modYalnızca TikTok — direct modda zorunlu
allow_commentbooleanYalnızca TikTok — yorumlara izin ver
allow_duetbooleanYalnızca TikTok — düetlere izin ver
allow_stitchbooleanYalnızca TikTok — stitch'e izin ver
your_brandbooleanYalnızca TikTok — organik tanıtım içeriği ("Markanız").
branded_contentbooleanYalnızca TikTok — markalı içerik açıklaması
tiktok_cover_msintegerYalnızca TikTok — kapak karesi zaman damgası ms cinsinden (0–60 000, varsayılan 1 000)

Duruma göre yanıtlar

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

Yayın başına hata kodları

KodAnlam
job_not_readyJob henüz tamamlanmadı
mode_not_supportedtext_to_mp3 job'ları yayınlanamaz
account_not_foundHesap bulunamadı veya bağlantısı kesildi
tiktok_privacy_requiredDirect modda gizlilik düzeyi gereklidir
publication_failedSağlayıcı yükleme sırasında hata döndürdü

cURL örneği

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> Son dosyayı indir

Son dosyayı akış olarak yayınlar. Content-Type, video modları için video/mp4, text_to_mp3 için audio/mpeg'dir. Token gerektirmez. Yalnızca durum ready olduğunda kullanılabilir.

Dosya iş tamamlandıktan 2 saat sonra silinir. Durum ready olur olmaz indirin.

İsteğe bağlı parametreler

ParametreAçıklama
filenameİndirilen dosya için önerilen ad (ör. benim-videoum.mp4)
previewBir indirmeyi tetiklemek yerine satır içi oynatma için (Content-Disposition: attachment'ı atlar) 1 olarak ayarlayın — tarayıcı içi önizleme için kullanılır.

curl örneği

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

Webhook'lar

Webhook'lar polling'e alternatiftir: durum her X saniyede kontrol etmek yerine bir URL sağlarsınız ve sunucu iş tamamlandığında sizi otomatik olarak çağırır.

Nasıl çalışır

  1. callback_url'yi /api/v1/render.php'ye gönderilen POST'a ekleyin
  2. Yanıt bir webhook_secret içerir — imzaları doğrulamak için saklayın
  3. İş ready veya error olduğunda sunucu URL'nize imzalı JSON POST gönderir
  4. HMAC-SHA256(webhook_secret, raw_body) ile imzayı doğrulayın
Kısıtlamalar: callback_url genel erişilebilir bir URL olmalıdır (http veya https). Özel, loopback ve ayrılmış IP adresleri sunucu tarafında engellenir. Zaman aşımı: 10 saniye.

Alınan yük

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

Sunucu tarafından gönderilen başlıklar

BaşlıkDeğer
Content-Typeapplication/json
X-RVM-Signaturesha256=<hmac_hex> — ham gövdenin HMAC-SHA256 imzası
X-RVM-Job-Idİlgili job_id

İmza doğrulama

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

Hata kodları

HTTPJSON koduNeden
401unauthorizedToken eksik, geçersiz veya iptal edilmiş
400missing_filesHiç dosya alınmadı
400too_few_files2'den az dosya gönderildi
400too_many_files20'den fazla dosya gönderildi
400invalid_mimeDesteklenmeyen dosya — yalnızca MP4, MP3 ve JPG/PNG kabul edilir
400wrong_file_countDosya sayısı seçilen moda uymuyor
400wrong_file_typesDosya türleri seçilen moda uymuyor
400invalid_file_combinationBelirtilen mod olmayan dosya kombinasyonu desteklenen hiçbir moda uymuyor
400invalid_optionsoptions alanı geçerli JSON değil
400invalid_optionoptions içindeki bir değer geçersiz
400file_too_largeBir dosya 500 MB'ı aşıyor
400invalid_orderorder dizisi geçerli bir permütasyon değil
400invalid_job_idHatalı job_id formatı (32 karakterli hex olmalı)
404job_not_foundİş bulunamadı — job_id bilinmiyor veya hiç oluşturulmamış
410job_expiredİş süresi doldu — mevcuttu ama 2 saatlik kurtarma penceresi geçti
429quota_exceededGünde 20 başarılı iş limitine ulaşıldı
429rate_limited/api/v1/jobs.php'de dakikada 12 çağrı aşıldı
500server_errorDahili sunucu hatası

Entegrasyon örnekleri

Her mod için örnekler — pip install requests ile requests kurun.

Ortak yapılandırma

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 modu — resim + ses → 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" }), }, )

Sesi düzenle

# 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 modu — görüntü içinde görüntü

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

Videoları birleştir

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 modu — metinden sese

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

Sorgulama + indirme (tüm modlar için ortak)

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'de iki yaklaşım: sorgulama (durum döngüsü) veya webhook (sunucu n8n'yi çağırır). Webhook önerilir.

Yaklaşım A — Webhook (önerilen)

Yalnızca 3 düğüm, döngü yok.

Düğüm 1 — Webhook tetikleyicisi
İş akışı girişi olarak bir Webhook düğümü ekleyin (yöntem POST).

Düğüm 2 — İş oluştur (HTTP İsteği)

YöntemPOST
URLhttps://rapidvideomaker.com/api/v1/render.php
Kimlik DoğrulamaHeader Auth — Authorization: Bearer rvm_…
Gövde İçerik TürüForm-Data Multipart
Body paramsHer klip için ikili alan videos[] + Metin alanı callback_url

İmzayı doğrulamak için yanıttaki webhook_secret'i bir iş akışı değişkeninde saklayın.

Düğüm 3 — Sonucu işle (webhook tarafından tetiklenen iş akışında)
n8n sunucunun POST'unu aldığında $json.status ready veya error'dur.

İmzayı doğrulamak için: {{ $headers['x-rvm-signature'] }}webhook_secret'inizden HMAC-SHA256 ile karşılaştırın.

Yaklaşım B — Sorgulama (webhook olmadan)

5 düğüm, her 10 sn'de durum döngüsü.

Düğüm 1 — İş oluşturcallback_url olmadan yukarıdakiyle aynı yapılandırma.

Düğüm 2 — Bekle — 10 saniye.

Düğüm 3 — Durum sorgula (HTTP İsteği GET)

URLhttps://rapidvideomaker.com/api/v1/jobs.php
Sorgu parametrelerijob_id = {{ $('Düğüm 1').item.json.job_id }}
Kimlik DoğrulamaBaşlık Kimlik Doğrulama — aynı token

Düğüm 4 — Eğer: {{ $json.status }} === 'ready' → doğru: Düğüm 5 / yanlış: Düğüm 2'ye geri.

Sonsuz döngüden kaçınmak için bir Set düğümüne yineleme sayacı ekleyin.

Düğüm 5 — İndir: {{ $json.download_url }} üzerinde HTTP İsteği GET.

Adım 1 — İş oluştur (bir mod seçin)

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

Adım 2 — Sorgulama

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

Adım 3 — İndir

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

En iyi uygulamalar

Sonuç dosyaları iş tamamlandıktan 2 saat sonra tutulur, ardından otomatik olarak silinir.