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

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 + 1 MP3 → ses düzenleme (mode=mix_audio ekle). Birden fazla MP4 → 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'ü 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 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 + 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 İ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 + 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, veya 1 MP4 + 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. Bu üç mod için zorunludur. Yalnızca tüm dosyalar MP4 olduğunda yok sayılır (fusion).
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).

Başarılı yanıt (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..." }

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

apidocs_th_paramTürVarsayılanapidocs_th_desc
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)

apidocs_th_paramTürapidocs_th_requiredapidocs_th_desc
job_idstringapidocs_requiredTamamlanan videonun job ID'si (hex 32 karakter)
publicationsarrayapidocs_requiredYayın nesneleri dizisi (maks. 10)

Yayın nesnesi

apidocs_th_paramTürapidocs_th_requiredapidocs_th_desc
account_idintegerapidocs_requiredBağ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: direct
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ı

apidocs_th_codeAnlam
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 MP4 dosyasını akış olarak döndürür (Content-Type: video/mp4). 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ı parametre

ParametreAçıklama
filenameİndirilen dosya için önerilen ad (ör. benim-videoum.mp4)

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

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.