RapidVideoMaker
অ্যাকাউন্ট তৈরি করুন

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 টোকেন পান
আপনার API টোকেন পেতে একটি অ্যাকাউন্ট তৈরি করুন — প্রতিদিন ২০টি অনুরোধ অন্তর্ভুক্ত
বিনামূল্যে অ্যাকাউন্ট তৈরি করুন ইতিমধ্যে অ্যাকাউন্ট আছে? সাইন ইন করুন

সম্পূর্ণ ওয়ার্কফ্লো

প্রতিটি ইন্টিগ্রেশন একই ৪-ধাপের ক্রম অনুসরণ করে:

1
জব তৈরি করুন — POST /api/v1/render.php
আপনার Bearer টোকন সহ multipart/form-data হিসেবে ফাইল পাঠান। ১টি JPG/PNG ছবি + ১টি MP3 + mode=image_to_video → ভিডিও জেনারেশন। ১টি MP4 + ১টি MP3 → অডিও সম্পাদনা। একাধিক MP4 → মার্জ। সার্ভার একটি অনন্য job_id ফেরত দেয়।
2
জবের জন্য অপেক্ষা করুন — GET /api/v1/jobs.php?job_id=…
নিয়মিত এই এন্ডপয়েন্ট পোল করুন (প্রতি ৫–১০ সে)। জব queuedprocessingready (বা error) পর্যন্ত অগ্রসর হয়।
3
ডাউনলোড URL পান
স্ট্যাটাস ready হলে, রেসপন্সে ব্যবহারের জন্য প্রস্তুত download_url ফিল্ড থাকে।
4
ফাইল ডাউনলোড করুন — GET /api/download.php?job_id=…
চূড়ান্ত MP4 ডাউনলোড করুন। জব সম্পন্ন হওয়ার ২ ঘণ্টা পর ফাইলটি স্বয়ংক্রিয়ভাবে মুছে যায়।

প্রমাণীকরণ

প্রতিটি অনুরোধে আপনার API টোকন থাকতে হবে। দুটি ফরম্যাট গ্রহণযোগ্য:

# প্রমাণীকরণ — প্রতিটি অনুরোধে আপনার API টোকন থাকতে হবে। দুটি ফরম্যাট গ্রহণযোগ্য: Authorization: Bearer rvm_your_token_here # Alternative X-API-Key: rvm_your_token_here

আপনার টোকন আপনার সদস্য এলাকায় পাওয়া যাবে — প্রতি অ্যাকাউন্টে একটি টোকন, নিবন্ধনে স্বয়ংক্রিয়ভাবে তৈরি হয়।

কোটা

প্রতিটি সদস্য অ্যাকাউন্টে প্রতিদিন ২০টি অনুরোধ আছে, ওয়েব ইন্টারফেস এবং API এর মধ্যে ভাগ করা। ব্যর্থ জব কোটা ব্যবহার করে না।

POST রেসপন্সে quota_used এবং quota_remaining অন্তর্ভুক্ত। সীমা অতিক্রম হলে সার্ভার 429 দিয়ে সাড়া দেয়।

ইন্টারফেস + API = একই কাউন্টার। ওয়েব ইন্টারফেস ও API অনুরোধ উভয়ই একই দৈনিক কোটা থেকে ১টি ক্রেডিট নেয়।

কিউ

একসময়ে একটি জব প্রসেস হয়। একাধিক জব একসাথে জমা দিলে সেগুলো কিউতে যায়। অপেক্ষার সময় স্ট্যাটাস রেসপন্সে অন্তর্ভুক্ত:

রেট লিমিট প্রযোজ্য: /api/v1/jobs.php এন্ডপয়েন্ট প্রতি টোকনে প্রতি মিনিটে ১২টি কল গ্রহণ করে। তার বেশি হলে 429 ফেরত আসে।

উপলব্ধ ট্রানজিশন

সরাসরি মার্জের জন্য transition_type=none (ডিফল্ট) পাস করুন, অথবা ক্লিপের মধ্যে ফেডের জন্য নিচের টাইপগুলোর একটি:

none fade fadeblack dissolve wipeleft wiperight slideleft slideright zoomin circleclose

সময়কাল (transition_duration) ০.২ থেকে ২.০ সেকেন্ডের মধ্যে।

এন্ডপয়েন্ট

POST /api/v1/render.php একটি ভিডিও প্রসেসিং জব তৈরি করে

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

ব্যবহারAPI মোডপ্রয়োজনীয় ফাইলবিবরণ
ভিডিও মার্জ করুন fusion ২–২০টি MP4 ফাইল ক্লিপগুলো নির্দিষ্ট ক্রমে একসাথে যুক্ত হয়। ক্লিপের মধ্যে ঐচ্ছিক ট্রানজিশন।
অডিও সম্পাদনা add_audio বা mix_audio ১টি MP4 + ১টি MP3 ভিডিওর অডিও ট্র্যাক প্রতিস্থাপন বা সমৃদ্ধ করে। ভিডিও ট্র্যাক কখনো রি-এনকোড হয় না (-c:v copy).
ভিডিও তৈরি করুন image_to_video ১টি JPG/PNG + ১টি MP3 একটি স্থির ছবি এবং অডিও ফাইল থেকে ভিডিও তৈরি করে। টেক্সট ওভারলে, ফেড, রেজোলিউশন এবং FPS options ফিল্ডের মাধ্যমে কনফিগারযোগ্য।
Overlay video overlay_video 2 MP4 Overlays a second video on top of the main one. Position, size, opacity and audio configurable via the options field.
টেক্সট থেকে MP3 text_to_mp3 (শুধু টেক্সট) টেক্সটকে বক্তৃতায় রূপান্তর করে এবং একটি MP3 ফাইল ফেরত দেয়। কোনো ফাইল আপলোড প্রয়োজন নেই — mode=text_to_mp3, text এবং lang ফর্ম ফিল্ড হিসেবে পাঠান।
কঠোর যাচাইকরণ: প্রতিটি মোডের জন্য সঠিক সংখ্যা ও ধরনের ফাইল প্রয়োজন। MIME টাইপ ম্যাজিক বাইটস দ্বারা যাচাই করা হয়।
সময়কাল নিয়ম: অডিও এবং image_to_video মোডে ফলাফলের সময়কাল MP3 এর সময়কালে লক থাকে।

সাধারণ প্যারামিটার (multipart/form-data)

ফিল্ডধরনপ্রয়োজনীয়বিবরণ
videos[]File[]হ্যাঁপ্রসেস করার ফাইল। মোড অনুযায়ী: ২–২০টি MP4, বা ১টি MP4 + ১টি MP3, বা ১টি ছবি (JPG/PNG) + ১টি MP3। প্রতি ফাইলে সর্বোচ্চ ৫০০ MB।
modestring*image_to_video | add_audio | mix_audio। এই তিনটি মোডের জন্য প্রয়োজনীয়।
orderJSONশুধু fusion মোড — ক্লিপের ক্রম নির্ধারণকারী JSON ইনডেক্স অ্যারে।
transition_typestringশুধু fusion মোড। ডিফল্ট: none
transition_durationfloatশুধু fusion মোড। সময়কাল ০.২–২.০ সে। ডিফল্ট: 0.5
optionsJSONশুধু image_to_video মোড — রেন্ডার প্যারামিটারের JSON অবজেক্ট (নিচে দেখুন)।
callback_urlstringপাবলিক URL (http/https) যা জব সম্পন্ন হলে কল হয়। রেসপন্সে webhook_secret থাকে।

options প্যারামিটার — image_to_video মোড

সবই ঐচ্ছিক। না দেওয়া মানগুলোতে ওয়ার্কার ডিফল্ট প্রয়োগ করে।

কীধরনডিফল্টবিবরণ
textstring""ওভারলে হিসেবে দেখানো টেক্সট। খালি = কোনো টেক্সট নেই। সর্বোচ্চ ৫০০ অক্ষর।
font_sizeint60পিক্সেলে ফন্ট সাইজ। পরিসীমা: ১০–৩০০।
text_colorstring"white"টেক্সটের রঙ (যেমন white, yellow, #ffffff)।
text_positionstring"center"টেক্সটের অবস্থান: center, top, bottom
boxbooltrueটেক্সটের পেছনে আধা-স্বচ্ছ পটভূমি।
box_colorstring"black@0.4"FFmpeg ফরম্যাটে রঙ + অস্বচ্ছতা: color@opacity
fade_durationfloat0.5সেকেন্ডে ফেড ইন/আউট সময়কাল (০–২)। ০ = কোনো ফেড নেই।
widthint1080পিক্সেলে ভিডিওর প্রস্থ (৬৪–৩৮৪০, জোড় সংখ্যা)।
heightint1920পিক্সেলে ভিডিওর উচ্চতা (৬৪–৩৮৪০, জোড় সংখ্যা)।
fpsint24ফ্রেম রেট (১–৬০)।
image_fitstring"contain"ফ্রেমিং মোড: contain = সম্পূর্ণ ছবি দৃশ্যমান; cover = ছবি পুরো ফ্রেম পূরণ করতে জুম হয়।
bg_colorstring"black"পটভূমির রঙ যদি ছবি লক্ষ্য রেজোলিউশন না পূরণ করে — শুধু image_fit=contain এর সাথে প্রাসঙ্গিক।
enable_image_motionboolfalseফটো অ্যানিমেশন সক্রিয় করে। false হলে ছবি স্থির থাকে।
image_motion_effectstring"ken_burns"অ্যানিমেশন ইফেক্ট। গৃহীত মান: 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_intensityfloat1.0ফটো অ্যানিমেশনের তীব্রতা (০.২৫–২.০)।
text_effectstring"none"টেক্সট ওভারলে অ্যানিমেশন। গৃহীত মান: none, fade_in, slide_up, slide_down, slide_left, bounce
text_effect_intensityfloat1.0টেক্সট অ্যানিমেশনের তীব্রতা (০.২৫–২.০)।
text_border_widthint0অক্ষরের চারপাশে কালো আউটলাইনের পুরুত্ব পিক্সেলে (০ = নিষ্ক্রিয়, ১–১০)।
text_modestring"static"টেক্সট প্রকাশের মোড। static (ডিফল্ট): প্রথম ফ্রেম থেকে সম্পূর্ণ টেক্সট দৃশ্যমান। word_by_word: word_reveal_speed-এর হারে একটি একটি করে শব্দ দেখা যায়। text_effect-এর সাথে একসাথে ব্যবহার করা যায় না: text_mode=word_by_word হলে text_effect উপেক্ষিত হয়।
word_reveal_speedfloat1.5প্রতি সেকেন্ডে শব্দ প্রকাশের গতি (0.3–5.0, ডিফল্ট 1.5)। শুধুমাত্র text_mode=word_by_word-এর সাথে। OpenAI TTS সিঙ্কের জন্য প্রস্তাবিত মান: 2.0।
word_animstring"none"প্রতিটি শব্দের আবির্ভাব অ্যানিমেশন। none (ডিফল্ট): তাৎক্ষণিক প্রকাশ। fade: প্রতিটি নতুন শব্দ 0.2s ফেডে প্রকাশ পায়। শুধুমাত্র text_mode=word_by_word এর সাথে।

options parameters — overlay_video mode

All optional. Upload order matters: the first file is the main video (background), the second file is the overlay (foreground). Use chroma_key to remove a green screen from the overlay.

কীধরনডিফল্টবিবরণ
positionstring"bottom-right"Corner where the overlay is placed: top-left, top-right, bottom-left, bottom-right, or center.
scalefloat0.30Overlay size as a fraction of the main video width. 0.25 = 25% of the width. Range: 0.05–1.0.
opacityfloat1.0Overlay transparency. 1.0 = fully opaque, 0.0 = invisible.
marginint10Gap in pixels between the overlay and the frame edge. Ignored when position=center. Range: 0–200.
audiostring"main"Which audio to keep. main: main video audio only. overlay: overlay audio only. mix: both tracks blended at equal volume.
chroma_keyboolfalseSet to true to remove the pure green (#00FF00) background of the overlay — useful for webcam or animations filmed on a green screen.
chroma_similarityfloat0.20Green screen tolerance. Low = strict match (preserves subject edges). High = broader removal (handles uneven lighting). Recommended: 0.10–0.20 for a digital green, 0.25–0.45 for a physical screen. Range: 0.01–0.60.

options প্যারামিটার — অডিও সম্পাদনা (mix_audio)

শুধু mode=mix_audio এর সাথে উপলব্ধ।

কীধরনডিফল্টবিবরণ
mp3_volumefloat1.0ওভারলেড MP3 এর ভলিউম (০.০ = নিঃশব্দ, ১.০ = মূল ভলিউম, ২.০ = দ্বিগুণ)।

সাফল্যের রেসপন্স (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 উদাহরণ — 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)

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 example — overlay_video mode

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 উদাহরণ — ভিডিও মার্জ

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> জব স্ট্যাটাস

সম্ভাব্য অবস্থা

অবস্থাঅর্থঅতিরিক্ত ফিল্ড
queued কিউতে, এখনো প্রসেস হয়নি queue_position, queue_total, eta_minutes
processing FFmpeg প্রসেসিং চলছে
ready সম্পন্ন — ফাইল উপলব্ধ download_url, created_at, expires_at
error প্রসেসিং ব্যর্থ error (message)

স্ট্যাটাস অনুযায়ী রেসপন্স

{ "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 List all jobs created with this token (paginated, sorted by date desc)

সাধারণ প্যারামিটার (multipart/form-data)

apidocs_th_paramধরনডিফল্টapidocs_th_desc
pageinteger1Page number (starts at 1)
limitinteger20Results per page (max 50, default 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 }
POST /api/v1/publish.php YouTube বা TikTok-এ ভিডিও প্রকাশ করুন

এক বা একাধিক সামাজিক অ্যাকাউন্টে একটি সম্পন্ন job (status=ready) প্রকাশ করে। টোকেনটি অবশ্যই একটি সদস্য অ্যাকাউন্টের হতে হবে (অ্যাডমিন টোকেন নয়)।

পূর্বশর্ত: এই endpoint ব্যবহারের আগে সামাজিক অ্যাকাউন্ট (YouTube, TikTok) সদস্য এলাকার প্রকাশনা পৃষ্ঠায় OAuth এর মাধ্যমে সংযুক্ত করতে হবে। প্রতিটি অ্যাকাউন্টের account_id সেখানে দেখানো হয়।

সাধারণ প্যারামিটার (multipart/form-data)

apidocs_th_paramধরনapidocs_th_requiredapidocs_th_desc
job_idstringapidocs_requiredসম্পন্ন ভিডিওর job ID (hex 32 অক্ষর)
publicationsarrayapidocs_requiredপ্রকাশনা অবজেক্টের অ্যারে (সর্বোচ্চ 10)

প্রকাশনা অবজেক্ট

apidocs_th_paramধরনapidocs_th_requiredapidocs_th_desc
account_idintegerapidocs_requiredসংযুক্ত সামাজিক অ্যাকাউন্টের ID — সদস্য এলাকার প্রকাশনা পৃষ্ঠায় পাওয়া যাবে
titlestringভিডিওর শিরোনাম (সর্বোচ্চ 512 অক্ষর)
descriptionstringভিডিওর বিবরণ (সর্বোচ্চ 5 000 অক্ষর)
tagsstringকমা-বিভক্ত ট্যাগ (সর্বোচ্চ 1 024 অক্ষর)
visibilitystringpublic | private | unlisted — ডিফল্ট: public
tiktok_modestringdraft | direct — শুধু TikTok — ডিফল্ট: direct
tiktok_privacystringdirect মোডশুধু TikTok — direct মোডে আবশ্যক
allow_commentbooleanশুধু TikTok — মন্তব্যের অনুমতি দিন
allow_duetbooleanশুধু TikTok — ডুয়েটের অনুমতি দিন
allow_stitchbooleanশুধু TikTok — স্টিচের অনুমতি দিন
your_brandbooleanশুধু TikTok — জৈব প্রচারমূলক বিষয়বস্তু ("আপনার ব্র্যান্ড")।
branded_contentbooleanশুধু TikTok — ব্র্যান্ডেড কন্টেন্ট প্রকাশ
tiktok_cover_msintegerশুধু TikTok — কভার ফ্রেম টাইমস্ট্যাম্প ms-এ (0–60 000, ডিফল্ট 1 000)

স্ট্যাটাস অনুযায়ী রেসপন্স

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

প্রতি প্রকাশনার ত্রুটি কোড

apidocs_th_codeঅর্থ
job_not_readyjob এখনো সম্পন্ন হয়নি
mode_not_supportedtext_to_mp3 jobs প্রকাশ করা যাবে না
account_not_foundঅ্যাকাউন্ট পাওয়া যায়নি বা সংযোগ বিচ্ছিন্ন
tiktok_privacy_requireddirect মোডে গোপনীয়তার স্তর আবশ্যক
publication_failedআপলোডের সময় প্রদানকারী একটি ত্রুটি ফেরত দিয়েছে

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> চূড়ান্ত ফাইল ডাউনলোড করুন

চূড়ান্ত MP4 ফাইল স্ট্রিম হিসেবে ফেরত দেয় (Content-Type: video/mp4)। টোকন প্রয়োজন নেই। শুধু তখনই উপলব্ধ যখন স্ট্যাটাস ready

ফাইলটি জব সম্পন্ন হওয়ার ২ ঘণ্টা পর রাখা হয়, তারপর মুছে যায়।

ঐচ্ছিক প্যারামিটার

প্যারামিটারবিবরণ
filenameডাউনলোড করা ফাইলের প্রস্তাবিত নাম (যেমন amar-video.mp4)

curl উদাহরণ

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

ওয়েবহুক

ওয়েবহুক পোলিংয়ের বিকল্প: প্রতি X সেকেন্ডে স্ট্যাটাস চেক করার পরিবর্তে, আপনি একটি URL দেন এবং সার্ভার জব সম্পন্ন হলে স্বয়ংক্রিয়ভাবে আপনাকে কল করে।

এটি কীভাবে কাজ করে

  1. /api/v1/render.php এ POST এ callback_url পাস করুন
  2. রেসপন্সে webhook_secret থাকে — সিগনেচার যাচাই করতে এটি রাখুন
  3. জব ready বা error এ পৌঁছালে সার্ভার আপনার URL এ স্বাক্ষরিত JSON POST পাঠায়
  4. HMAC-SHA256(webhook_secret, raw_body) দিয়ে সিগনেচার যাচাই করুন
সীমাবদ্ধতা: callback_url অবশ্যই একটি সার্বজনীনভাবে অ্যাক্সেসযোগ্য URL হতে হবে। ব্যক্তিগত এবং লুপব্যাক IP ঠিকানা ব্লক করা।

প্রাপ্ত পেলোড

{ "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> — raw body এর 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২টির কম ফাইল পাঠানো হয়েছে
400too_many_files২০টির বেশি ফাইল পাঠানো হয়েছে
400invalid_mimeঅসমর্থিত ফাইল — শুধু MP4, MP3 এবং JPG/PNG ছবি গ্রহণযোগ্য
400wrong_file_countফাইলের সংখ্যা নির্বাচিত মোডের সাথে মেলে না
400wrong_file_typesফাইলের ধরন নির্বাচিত মোডের সাথে মেলে না
400invalid_file_combinationমোড ছাড়া ফাইল সমন্বয় কোনো সমর্থিত মোডের সাথে মেলে না
400invalid_optionsoptions ফিল্ড বৈধ JSON নয়
400invalid_optionoptions এ একটি মান অবৈধ
400file_too_largeএকটি ফাইল ৫০০ MB ছাড়িয়েছে
400invalid_orderorder অ্যারে বৈধ পারমুটেশন নয়
400invalid_job_idভুল job_id ফরম্যাট (৩২-অক্ষরের হেক্স হতে হবে)
404job_not_foundজব পাওয়া যায়নি — job_id অজানা বা কখনো ছিল না
410job_expiredজব মেয়াদোত্তীর্ণ — ছিল কিন্তু ২ ঘণ্টার রিকভারি উইন্ডো পার হয়েছে
429quota_exceededপ্রতিদিন ২০টি সফল জব পৌঁছেছে
429rate_limited/api/v1/jobs.php এ প্রতি মিনিটে ১২টির বেশি কল — Retry-After সেকেন্ড অপেক্ষা করুন
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" "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 mode — picture-in-picture

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

ভিডিও মার্জ

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

পোলিং + ডাউনলোড (সব মোডের জন্য সাধারণ)

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 এ দুটি পদ্ধতি: পোলিং (স্ট্যাটাস লুপ) বা ওয়েবহুক (সার্ভার n8n কে কল করে)। ওয়েবহুক সুপারিশ করা হয়।

পদ্ধতি A — ওয়েবহুক (সুপারিশকৃত)

মাত্র ৩টি নোড, কোনো লুপ নেই।

নোড ১ — ওয়েবহুক ট্রিগার
ওয়ার্কফ্লো ইনপুট হিসেবে একটি Webhook নোড যোগ করুন (মেথড POST)।

নোড ২ — জব তৈরি করুন (HTTP Request)

মেথডPOST
URLhttps://rapidvideomaker.com/api/v1/render.php
প্রমাণীকরণHeader Auth — Authorization: Bearer rvm_…
Body Content TypeForm-Data Multipart
Body paramsপ্রতিটি ক্লিপের জন্য বাইনারি ফিল্ড videos[] + টেক্সট ফিল্ড callback_url = উপরের ওয়েবহুক নোড URL

সিগনেচার যাচাই করতে রেসপন্স থেকে webhook_secret একটি ওয়ার্কফ্লো ভেরিয়েবলে সংরক্ষণ করুন।

নোড ৩ — ফলাফল প্রসেস করুন (ওয়েবহুক-ট্রিগার্ড ওয়ার্কফ্লোতে)
n8n সার্ভারের POST পেলে, $json.status ready বা error হয়। ready হলে $json.download_url এ সরাসরি ডাউনলোড URL থাকে।

সিগনেচার যাচাই করতে: আপনার webhook_secret থেকে raw body এর HMAC-SHA256 এর সাথে {{ $headers['x-rvm-signature'] }} তুলনা করুন।

পদ্ধতি B — পোলিং (ওয়েবহুক ছাড়া)

৫টি নোড, প্রতি ১০ সেকেন্ডে স্ট্যাটাস লুপ।

নোড ১ — জব তৈরি করুন — উপরের মতো কনফিগ, callback_url ছাড়া।

নোড ২ — অপেক্ষা করুন — ১০ সেকেন্ড।

নোড ৩ — স্ট্যাটাস পোল করুন (HTTP Request GET)

URLhttps://rapidvideomaker.com/api/v1/jobs.php
Query প্যারামিটারjob_id = {{ $('নোড ১').item.json.job_id }}
প্রমাণীকরণHeader Auth — একই টোকন

নোড ৪ — If: {{ $json.status }} === 'ready' → true: নোড ৫ / false: নোড ২ এ ফিরুন।

অসীম লুপ এড়াতে ৬০টি প্রচেষ্টার পর লুপ ভাঙতে Set নোডে একটি ইটারেশন কাউন্টার যোগ করুন।

নোড ৫ — ডাউনলোড: {{ $json.download_url }} এ HTTP Request GET, Response Format File

ধাপ ১ — জব তৈরি করুন (একটি মোড বেছে নিন)

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

ধাপ ২ — পোলিং

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

ধাপ ৩ — ডাউনলোড

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

সেরা অনুশীলন

ফলাফল ফাইলগুলো জব সম্পন্ন হওয়ার ২ ঘণ্টা পর স্বয়ংক্রিয়ভাবে মুছে যায়। স্ট্যাটাস ready হওয়ার সাথে সাথে ভিডিও ডাউনলোড করুন।