মূল বিষয়বস্তুতে যান
Transcript Dock
সাইন ইনবিনামূল্যে শুরু করুন

সাইট মেনু

Transcript Dock
ভূমিকাকীভাবে কাজ করে, গাইড, এবং আপনি কী ট্রান্সক্রাইব করতে পারেন।
কুইকস্টার্টএকটি লিংক জমা দিন, কাজ শেষ হওয়ার অপেক্ষা করুন, ট্রান্সক্রিপ্ট এক্সপোর্ট করুন। তিনটি রিকোয়েস্ট।
অথেনটিকেশনAPI কী, স্কোপ, Idempotency-Key ও X-Request-Id।
কাজকাজ তৈরি, অপেক্ষা, তালিকা দেখা, বাতিল ও আবার চালানো।
ট্রান্সক্রিপ্টট্রান্সক্রিপ্ট অবজেক্ট এবং txt, srt, vtt, json এক্সপোর্ট।
ব্যাচএকটি রিকোয়েস্টে সর্বোচ্চ 50টি ভিডিও।
আপলোডআপনার নিজের অডিও ও ভিডিও ফাইল ট্রান্সক্রাইব করুন।
ওয়েবহুককাজ বা ব্যাচ শেষ হলে কল পান; সিগনেচার যাচাই করুন।
এররপ্রতিটি এরর কোড, তার অর্থ এবং কী করতে হবে।
রেট লিমিটপ্রতি প্ল্যানে জমা দেওয়া, চলমান কাজ ও রিড; 429 রেসপন্স।
মূল্য ও ক্রেডিটক্যাপশন ট্রান্সক্রিপ্টে প্রতি 1 ক্রেডিট, AI ট্রান্সক্রিপশনে প্রতি মিনিটে 2 ক্রেডিট। প্ল্যান ও অতিরিক্ত ক্রেডিট।
সোর্সYouTube, TikTok, আপনার ফাইল ও সরাসরি লিংক: গ্রহণযোগ্য URL ও মোড।
MCPClaude, Cursor, Windsurf বা আপনার নিজের এজেন্ট থেকে ভিডিও খুঁজুন ও ট্রান্সক্রাইব করুন।
OpenAPI স্পেসিফিকেশনকোড জেনারেশন ও টাইপড ক্লায়েন্টের জন্য OpenAPI 3.1 স্পেক।
Claude Codeএকটি কমান্ডেই Claude Code-এ Transcript Dock যুক্ত হয়।
Claude অ্যাপclaude.ai, Claude Desktop বা মোবাইলে কাস্টম কানেক্টর হিসেবে Transcript Dock যুক্ত করুন।
CursorCursor-এ MCP সার্ভার হিসেবে Transcript Dock যুক্ত করুন।
WindsurfWindsurf-এ Transcript Dock যুক্ত করুন, যাতে Cascade ভিডিও খুঁজে ট্রান্সক্রাইব করতে পারে।
OpenClawOpenClaw স্বয়ংক্রিয় এজেন্টের সাথে Transcript Dock সংযুক্ত করুন।
১৯ ফলাফল
API

API রেফারেন্স

এন্ডপয়েন্ট, ফিল্ড, রেসপন্স, ক্রেডিট, সীমা ও ত্রুটি।

আপডেট হয়েছে


কীভাবে কাজ করে#

প্রতিটি ট্রান্সক্রিপ্ট একটি কাজ। আপনি একটি উৎস জমা দেন, কাজটি ব্যাকগ্রাউন্ডে চলে, আর সফল হলে সেটি একটি ট্রান্সক্রিপ্টের দিকে নির্দেশ করে, যা আপনি যতবার খুশি পড়তে বা এক্সপোর্ট করতে পারেন। বেস URL: https://www.transcriptdock.com। সব অনুরোধ ও উত্তর JSON।

# 1. Submit
curl -X POST https://www.transcriptdock.com/v1/jobs \
-H "Authorization: Bearer td_live_YOUR_KEY" \
-H "Idempotency-Key: video-7680721699171601694" \
-H "Content-Type: application/json" \
-d '{ "source": { "url": "https://www.tiktok.com/@tiktok/video/7680721699171601694" }, "mode": "captions_only" }'
 
# 2. Wait (returns as soon as the job finishes, up to 25 s per call)
curl "https://www.transcriptdock.com/v1/jobs/11111111-1111-4111-8111-111111111111?wait=25" \
-H "Authorization: Bearer td_live_YOUR_KEY"
 
# 3. Export
curl "https://www.transcriptdock.com/v1/transcripts/22222222-2222-4222-8222-222222222222/export?format=srt" \
-H "Authorization: Bearer td_live_YOUR_KEY"
ব্রাউজার থেকে কখনো API কল করবেন না: তাহলে আপনার কী যে কেউ দেখতে পাবে। আপনার সার্ভার থেকে কল করুন এবং কীটি একটি এনভায়রনমেন্ট ভেরিয়েবলে রাখুন।

প্রমাণীকরণ#

API কী পাতায় কী তৈরি করুন। কী একবারই দেখানো হয়, দেখতে td_live_... ধরনের, এবং প্রতিটি অনুরোধের Authorization হেডারে যায়। কী তৈরির সময় বাছাই করা স্কোপ থাকে: jobs:read, jobs:write, transcripts:read, uploads:write। প্রতিটি ইন্টিগ্রেশনের জন্য আলাদা একটি কী তৈরি করুন, যেন শুধু সেটি বাতিল করা যায়।

হেডার
Authorization: Bearer td_live_YOUR_KEY

Idempotency-Key#

নিচের এন্ডপয়েন্টগুলোতে এটি লাগে: POST /v1/jobs, /v1/batches, /v1/jobs/{id}/retry, /v1/video-discoveries ও /v1/language-discoveries। এটি যেকোনো 8 থেকে 128টি প্রিন্টেবল ASCII অক্ষরের হতে হবে। 48 ঘণ্টার মধ্যে একই বডিসহ একই কী পাঠালে মূল অবজেক্টটি ফেরত আসে, তাই আবার চেষ্টা করা অনুরোধে কোনো কিছু দুবার তৈরি বা চার্জ হয় না। একই কী ভিন্ন বডিসহ পাঠালে 409 IDEMPOTENCY_CONFLICT ফেরত আসে। ভালো কী হলো আপনার নিজের দেওয়া সেই আইডি, যা দিয়ে আপনি যে জিনিসটি ট্রান্সক্রাইব করছেন তা চিহ্নিত হয়।

X-Request-Id#

প্রতিটি উত্তরে এটি থাকে। সাপোর্টে যোগাযোগের সময় এটি উল্লেখ করুন।

এন্ডপয়েন্ট#

মেথডপাথযা করেক্রেডিট
POST/v1/jobsএকটি ভিডিও, ফাইল বা লিংক ট্রান্সক্রাইব করুনক্যাপশন ট্রান্সক্রিপ্টে প্রতিটির জন্য 1, AI ট্রান্সক্রিপশনের প্রতি মিনিটে 2
GET/v1/jobs/{id}কাজের স্ট্যাটাস, সর্বোচ্চ 25 সেকেন্ড অপেক্ষা করেফ্রি
GET/v1/jobsকাজের ইতিহাসফ্রি
POST/v1/jobs/{id}/cancelসারিতে থাকা কাজ বাতিল করুনফ্রি
POST/v1/jobs/{id}/retryব্যর্থ কাজ আবার চালাননতুন কাজ হিসেবে
POST/v1/batchesঅনেক ভিডিও ট্রান্সক্রাইব করুন (প্ল্যানের ব্যাচের আকার অনুযায়ী)প্রতিটি আইটেমের জন্য, উপরের নিয়মে
GET/v1/batches/{id}ব্যাচের স্ট্যাটাসফ্রি
GET/v1/transcripts/{id}ট্রান্সক্রিপ্ট JSONফ্রি
GET/v1/transcripts/{id}/exporttxt, srt, vtt বা json ফাইলফ্রি
DELETE/v1/transcripts/{id}একটি ট্রান্সক্রিপ্ট মুছুনফ্রি
POST/v1/uploadsফাইল আপলোড করার জন্য একটি URL নিনফ্রি
POST/v1/uploads/{id}/completeআপলোড শেষ হিসেবে চিহ্নিত করুনফ্রি
POST/v1/video-discoveriesYouTube খুঁজুন, চ্যানেল, প্লেলিস্ট বা TikTok প্রোফাইলের তালিকা দেখুনপ্রতি পাতায় 1
GET/v1/video-discoveries/{id}খোঁজের ফলাফলফ্রি
POST/v1/language-discoveriesএকটি YouTube ভিডিওর ক্যাপশনের ভাষার তালিকা দেখুন1
GET/v1/language-discoveries/{id}ভাষার তালিকাফ্রি
POST/v1/webhook-endpointsএকটি ওয়েবহুক URL নিবন্ধন করুন (সাইন ইন করা সেশনে)ফ্রি
GET/v1/webhook-endpointsওয়েবহুক URL এর তালিকাফ্রি
DELETE/v1/webhook-endpoints/{id}একটি ওয়েবহুক URL বন্ধ করুন (সাইন ইন করা সেশনে)ফ্রি
GET/v1/usageক্রেডিট ও প্ল্যানফ্রি
GET/v1/capabilitiesআপনার কী কী করতে পারেফ্রি

কাজ তৈরি করুন#

POST/v1/jobs
source.urlstringঐচ্ছিক
একটি পাবলিক ভিডিও: YouTube (watch?v=, youtu.be, shorts, live) বা TikTok (tiktok.com/@user/video/…, vm.tiktok.com শেয়ার লিংক)। অডিও বা ভিডিও ফাইলের যেকোনো অন্য https লিংক সরাসরি মিডিয়া লিংক হিসেবে ধরা হয় (AI ট্রান্সক্রিপশন)। url বা upload_id এর মধ্যে একটি লাগবেই।
source.upload_iduuidঐচ্ছিক
আপনার আপলোড করা একটি ফাইল (দেখুন আপলোড)। সবসময় AI ট্রান্সক্রিপশন।
mode"captions_only" | "auto" | "transcribe"আবশ্যক
captions_only: ভিডিওর নিজের ক্যাপশন, 1 ক্রেডিট; না থাকলে NO_CAPTIONS দিয়ে ব্যর্থ হয়। auto: ক্যাপশন থাকলে সেগুলো (1 ক্রেডিট), না থাকলে AI ট্রান্সক্রিপশন। transcribe: সবসময় অডিওর AI ট্রান্সক্রিপশন, শুরু হওয়া প্রতি মিনিটে 2 ক্রেডিট, শব্দ অনুযায়ী সময়সহ। AI ট্রান্সক্রিপশনের জন্য পেইড প্ল্যান লাগে।
caption_languagesstring[]ঐচ্ছিক
ক্রম অনুযায়ী পছন্দের ক্যাপশন ভাষা, যেমন ["en", "es"], সর্বোচ্চ 5টি। ডিফল্ট: ভিডিওর ডিফল্ট ট্র্যাক। শুধু captions_only ও auto মোডে।
caption_preference"prefer_creator" | "creator_only" | "automatic_only"ঐচ্ছিক
নির্মাতার আপলোড করা ক্যাপশন, YouTube এর স্বয়ংক্রিয় ক্যাপশন, নাকি দুটোর যেকোনোটি নেওয়া হবে (ডিফল্ট prefer_creator: আগে নির্মাতারটি)।
languagestringঐচ্ছিক
AI ট্রান্সক্রিপশনের জন্য কথ্য ভাষার ইঙ্গিত (BCP 47)। ডিফল্ট: নিজে শনাক্ত করা।
max_creditsintegerঐচ্ছিক
AI ট্রান্সক্রিপশনের খরচের সীমা। আগে মিডিয়ার দৈর্ঘ্য মাপা হয়; খরচ এর বেশি হলে কাজটি BUDGET_EXCEEDED দিয়ে ব্যর্থ হয় এবং কোনো চার্জ হয় না। ডিফল্ট: 2 ঘণ্টার জন্য যথেষ্ট।
webhook_endpoint_iduuidঐচ্ছিক
এই ওয়েবহুকে job.succeeded ও job.failed ইভেন্ট পাবেন।
metadataobjectঐচ্ছিক
সর্বোচ্চ 10টি স্ট্রিং মান (কী ≤ 64, মান ≤ 256 অক্ষর)। ওয়েবহুক ইভেন্টে ফেরত আসে। ক্যাশিংয়ে কোনো প্রভাব ফেলে না।

কাজসহ 202 ফেরত আসে। আপনার ওয়ার্কস্পেসে একই ভিডিও ও একই বিকল্পের জন্য ট্রান্সক্রিপ্ট আগে থেকে থাকলে বিনা খরচে সফল কাজসহ 200 ফেরত আসে (billing.kind: "cached")।

202 রেসপন্স
{
"id": "11111111-1111-4111-8111-111111111111",
"status": "queued",
"stage": "resolve",
"result_id": null,
"error": null,
"billing": { "credits_reserved": 2, "credits_charged": 0, "kind": "captions" },
"source": { "platform": "tiktok", "media_id": "7680721699171601694", "canonical_url": "https://www.tiktok.com/@tiktok/video/7680721699171601694", "title": null, "upload_id": null },
"options": { "mode": "auto", "language": null, "caption_preference": "prefer_creator" },
"created_at": "2026-09-16T10:00:00.000Z"
}

কাজের অবজেক্ট#

iduuidঐচ্ছিক
কাজের আইডি।
statusstringঐচ্ছিক
queued → processing (AI ট্রান্সক্রিপশনের সময় → awaiting_provider) → succeeded, failed বা cancelled। শেষের তিনটি চূড়ান্ত।
stagestring | nullঐচ্ছিক
চলমান কাজটি কোন ধাপে আছে: resolve, captions, acquire_audio, submit_asr, wait_asr, finalize। শুধু তথ্যের জন্য।
result_iduuid | nullঐচ্ছিক
সফল হলে ট্রান্সক্রিপ্ট।
errorobject | nullঐচ্ছিক
ব্যর্থ হলে: code, message, retryable, এবং ঐচ্ছিক details.detail। কোডগুলো ত্রুটি অংশের মতোই।
billingobjectঐচ্ছিক
credits_reserved (চলার সময় ধরে রাখা, শেষ হলে 0), credits_charged (চূড়ান্ত), kind: captions, ai_transcription বা cached।
sourceobjectঐচ্ছিক
platform, media_id, canonical_url, title, upload_id।
optionsobjectঐচ্ছিক
গৃহীত mode, language, caption_preference।
created_atdate-timeঐচ্ছিক
UTC।

কাজ দেখুন#

GET/v1/jobs/{id}?wait=25

কাজটি ফেরত আসে। wait (0 থেকে 25 সেকেন্ড) দিলে অনুরোধটি খোলা থাকে এবং কাজ চূড়ান্ত হলেই ফেরত আসে, তাই একটি কল পোলিং লুপের কাজ করে। পড়ার অনুরোধের আলাদা সীমা প্রতি মিনিটে 120।

কাজের তালিকা#

GET/v1/jobs?limit=20&cursor=

সবচেয়ে নতুনটি আগে, limit 1 থেকে 100। পরের পাতার জন্য উত্তরের next_cursor আবার cursor হিসেবে পাঠান। একটি ভিডিওর কাজগুলো শুধু দেখতে platform ও source_id (কাজের source.media_id) একসাথে যোগ করুন, যেকোনো মোডে। নতুন করে জমা দেওয়ার আগে ওয়ার্কস্পেসে ট্রান্সক্রিপ্ট আগে থেকে আছে কি না, ক্লায়েন্ট এভাবেই পরীক্ষা করে।

কাজ বাতিল করুন#

POST/v1/jobs/{id}/cancel

AI ট্রান্সক্রিপশন শুরু না হওয়া কাজ বাতিল করা যায়; ধরে রাখা ক্রেডিট ছেড়ে দেওয়া হয়। তার পরে 409 CANCELLATION_NOT_ALLOWED ফেরত আসে এবং কাজটি শেষ হয়।

কাজ আবার চালান#

POST/v1/jobs/{id}/retry

একটি ব্যর্থ কাজ থেকে নতুন কাজ তৈরি হয়, যদি তার ত্রুটি retryable হয়। নতুন Idempotency-Key লাগবে; ঐচ্ছিক বডি { "max_credits": 40 }। দাম নতুন কাজের মতোই। চূড়ান্ত ব্যর্থতায় (ব্যক্তিগত ভিডিও, ক্যাপশন নেই) 409 JOB_NOT_RETRYABLE ফেরত আসে: ইনপুট ঠিক করে আবার জমা দিন।

ট্রান্সক্রিপ্ট#

GET/v1/transcripts/{id}
iduuidঐচ্ছিক
কাজের result_id এর মতোই।
sourceobjectঐচ্ছিক
platform, media_id, canonical_url, title।
source_originstringঐচ্ছিক
creator_captions, platform_captions (প্ল্যাটফর্মের তৈরি ক্যাপশন, যেমন YouTube এর স্বয়ংক্রিয় ক্যাপশন) বা speech_recognition (AI ট্রান্সক্রিপশন)।
languagestring | nullঐচ্ছিক
লেখার BCP 47 ট্যাগ।
textstringঐচ্ছিক
পুরো ট্রান্সক্রিপ্ট সাধারণ লেখায়।
segmentsarrayঐচ্ছিক
ক্যাপশনের আকারের টুকরো: { start, end, text }, সেকেন্ডে।
wordsarray | nullঐচ্ছিক
প্রতিটি শব্দের জন্য { start, end, text, confidence }। শুধু AI ট্রান্সক্রিপশনে।
timing_granularity"word" | "segment" | "none"ঐচ্ছিক
উপলব্ধ সবচেয়ে সূক্ষ্ম সময়।
duration_secondsnumber | nullঐচ্ছিক
মিডিয়ার দৈর্ঘ্য।
extraction_versionstringঐচ্ছিক
যে পাইপলাইন ফলাফল তৈরি করেছে তার সংস্করণ।
recognitionobject | nullঐচ্ছিক
শুধু AI ট্রান্সক্রিপশনে: model, profile, quality_status (validated_language: আমরা এর মান যাচাই করেছি; provider_supported: মডেল ভাষাটি তালিকাভুক্ত করেছে; experimental_language: মান ভিন্ন হতে পারে)।
created_atdate-timeঐচ্ছিক
UTC।
200 রেসপন্স
{
"id": "22222222-2222-4222-8222-222222222222",
"source": { "platform": "youtube", "media_id": "dQw4w9WgXcQ", "canonical_url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ", "title": "Never Gonna Give You Up" },
"source_origin": "creator_captions",
"language": "en",
"text": "Never gonna give you up. Never gonna let you down.",
"segments": [
{ "start": 0, "end": 2.4, "text": "Never gonna give you up" },
{ "start": 2.4, "end": 4.9, "text": "Never gonna let you down" }
],
"words": null,
"timing_granularity": "segment",
"duration_seconds": 212.0,
"recognition": null,
"extraction_version": "worker-0.1.0",
"created_at": "2026-09-16T10:00:14.000Z"
}

ট্রান্সক্রিপ্ট আপনার প্ল্যানের সংরক্ষণের মেয়াদ পর্যন্ত রাখা হয় (ট্রায়ালে 7 দিন, Starter এ 30, Pro ও Scale এ 90)। আগেই মুছতে DELETE /v1/transcripts/{id} ব্যবহার করুন।

ট্রান্সক্রিপ্ট এক্সপোর্ট করুন#

GET/v1/transcripts/{id}/export?format=srt
formatযা পাবেন
txtসাধারণ লেখা, প্রতি লাইনে একটি অংশ।
srtSubRip সাবটাইটেল।
vttWebVTT সাবটাইটেল।
jsonউপরের ট্রান্সক্রিপ্ট অবজেক্ট।

বিনা খরচে, সীমাহীন। srt ও vtt সময় চায়; সময় ছাড়া ট্রান্সক্রিপ্ট 422 TIMESTAMPS_UNAVAILABLE ফেরত দেয়।

ব্যাচ#

POST/v1/batches

একটি অনুরোধে অনেক ভিডিও। প্রতিটি আইটেমের ফিল্ডগুলো কাজ তৈরি করুন অংশের মতোই; পুরো ব্যাচ একসাথে গৃহীত বা প্রত্যাখ্যাত হয়। প্রতি ব্যাচে আইটেমের সংখ্যা: ট্রায়ালে 1, Starter এ 10, Pro এ 25, Scale এ 50।

itemsJobRequest[]আবশ্যক
1 থেকে 50টি কাজের অনুরোধ।
webhook_endpoint_iduuidঐচ্ছিক
প্রতিটি আইটেম চূড়ান্ত হলে একটি batch.completed পাবেন।
metadataobjectঐচ্ছিক
batch.completed ইভেন্টে ফেরত আসে।
POST /v1/batches
curl -X POST https://www.transcriptdock.com/v1/batches \
-H "Authorization: Bearer td_live_YOUR_KEY" \
-H "Idempotency-Key: playlist-2026-09-16" \
-H "Content-Type: application/json" \
-d '{ "items": [
{ "source": { "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ" }, "mode": "captions_only" },
{ "source": { "url": "https://www.tiktok.com/@tiktok/video/7680721699171601694" }, "mode": "captions_only" }
] }'

ব্যাচ অবজেক্টে আছে status (queued, processing, succeeded, partial_success, failed, cancelled), গণনা (total_items, succeeded_items, failed_items, cancelled_items) এবং items, যার প্রতিটিতে নিজস্ব job_id থাকে। পড়তে GET /v1/batches/{id} ব্যবহার করুন; প্রতিটি আইটেম একটি সাধারণ কাজ।

আপলোড#

আপনার নিজের অডিও বা ভিডিও (mp3, wav, m4a, ogg, aac, mp4, webm; সর্বোচ্চ 250 MB ও 2 ঘণ্টা)। একটি স্লট সংরক্ষণ করুন, সাইন করা URL এ ফাইল PUT করুন, সম্পূর্ণ হিসেবে চিহ্নিত করুন, তারপর source.upload_id দিয়ে একটি কাজ হিসেবে জমা দিন। আপলোড সবসময় AI ট্রান্সক্রিপশন ব্যবহার করে।

আপলোড ও ট্রান্সক্রাইব
# 1. Reserve
curl -X POST https://www.transcriptdock.com/v1/uploads \
-H "Authorization: Bearer td_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{ "filename": "interview.mp3", "content_type": "audio/mpeg", "bytes": 48213920 }'
# -> { "id": "33333333-...", "signed_upload_url": "https://...", "expires_at": "...", "status": "pending" }
 
# 2. Upload the bytes (same Content-Type you declared)
curl -X PUT "SIGNED_UPLOAD_URL" -H "Content-Type: audio/mpeg" --data-binary @interview.mp3
 
# 3. Complete
curl -X POST https://www.transcriptdock.com/v1/uploads/33333333-3333-4333-8333-333333333333/complete \
-H "Authorization: Bearer td_live_YOUR_KEY"
 
# 4. Transcribe it
curl -X POST https://www.transcriptdock.com/v1/jobs \
-H "Authorization: Bearer td_live_YOUR_KEY" \
-H "Idempotency-Key: interview-01" \
-H "Content-Type: application/json" \
-d '{ "source": { "upload_id": "33333333-3333-4333-8333-333333333333" }, "mode": "transcribe" }'
filenamestringআবশ্যক
সর্বোচ্চ 255 অক্ষর।
content_typestringআবশ্যক
ফাইলের MIME ধরন, যেমন audio/mpeg বা video/mp4। PUT অনুরোধেও একই মান পাঠান।
bytesintegerআবশ্যক
সঠিক ফাইলের আকার। PUT অনুরোধের আকার মিলতে হবে।

সাইন করা URL 24 ঘণ্টা বৈধ; এরপর নতুন স্লট সংরক্ষণ করুন।

ওয়েবহুক#

POST/v1/webhook-endpoints

একটি https URL নিবন্ধন করুন, তারপর কাজ জমা দেওয়ার সময় তার id webhook_endpoint_id হিসেবে পাঠান। কাজ বা ব্যাচ শেষ হলে আমরা একটি ইভেন্ট POST করি। উত্তরে স্বাক্ষরের secret একবারই দেওয়া হয়। এন্ডপয়েন্ট নিবন্ধন ও বন্ধ করতে সাইন ইন করা সেশন লাগে, তাই এটি ড্যাশবোর্ডের ওয়েবহুক পাতায় করুন; সেখানে API কী দিয়ে 403 FORBIDDEN আসে, তবে এন্ডপয়েন্টের তালিকা দেখা যায়।

urlstringআবশ্যক
https URL, সর্বোচ্চ 2048 অক্ষর।
descriptionstringঐচ্ছিক
আপনার নিজের সুবিধার জন্য একটি লেবেল।

ইভেন্ট#

job.succeeded
{
"event_id": "44444444-4444-4444-8444-444444444444",
"type": "job.succeeded",
"created_at": "2026-09-16T10:00:14.000Z",
"job_id": "11111111-1111-4111-8111-111111111111",
"batch_id": null,
"result_id": "22222222-2222-4222-8222-222222222222",
"metadata": { "order": "8812" },
"error": null
}
  • job.succeeded: result_id দেখুন বা এক্সপোর্ট করুন।
  • job.failed: error এ কোড থাকে।
  • batch.completed: প্রতিটি আইটেম চূড়ান্ত; প্রতিটি আইটেমের ফলাফল দেখতে ব্যাচ পড়ুন।

কয়েক সেকেন্ডের মধ্যে যেকোনো 2xx দিয়ে উত্তর দিন। ব্যর্থ ডেলিভারি ব্যাকঅফসহ আবার চেষ্টা হয় এবং ড্যাশবোর্ড থেকে আবার পাঠানো যায়। একই ইভেন্ট একাধিকবার আসতে পারে: ডুপ্লিকেট বাদ দিতে event_id দেখুন।

স্বাক্ষর যাচাই করুন#

হেডার X-TranscriptDock-Event-Id, X-TranscriptDock-Timestamp এবং X-TranscriptDock-Signature। স্বাক্ষর হলো {event_id}.{timestamp}.{raw_body} এর HMAC-SHA256 (hex), আপনার সিক্রেট দিয়ে। পাঁচ মিনিটের পুরনো যেকোনো কিছু প্রত্যাখ্যান করুন।

import crypto from "node:crypto";
 
export function verify(eventId: string, timestamp: string, rawBody: string, signature: string, secret: string): boolean {
if (Math.abs(Date.now() / 1000 - Number(timestamp)) > 300) return false;
const expected = crypto.createHmac("sha256", secret).update(`${eventId}.${timestamp}.${rawBody}`).digest("hex");
return expected.length === signature.length && crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signature));
}

ভিডিও খুঁজুন#

POST/v1/video-discoveries

YouTube খুঁজুন, বা একটি চ্যানেল, প্লেলিস্ট বা TikTok প্রোফাইলের তালিকা দেখুন, তারপর URL গুলো কাজে পাঠান। একটি খোঁজও কাজের মতো ব্যাকগ্রাউন্ডে চলে: status succeeded না হওয়া পর্যন্ত GET /v1/video-discoveries/{id} পড়ুন। প্রতি পাতায় 1 ক্রেডিট; ফলাফল 24 ঘণ্টা রাখা হয়।

kindstringআবশ্যক
youtube_search, youtube_channel_videos, youtube_channel_search, youtube_playlist_videos বা tiktok_user_videos।
querystringঐচ্ছিক
খোঁজার টেক্সট (youtube_search, youtube_channel_search)।
channelstringঐচ্ছিক
@handle, চ্যানেল আইডি বা চ্যানেল URL (চ্যানেল ধরন)।
playliststringঐচ্ছিক
প্লেলিস্ট আইডি বা URL (youtube_playlist_videos)।
userstringঐচ্ছিক
@user বা প্রোফাইল URL (tiktok_user_videos)।
limitintegerঐচ্ছিক
প্রতি পাতায় ভিডিও, 1 থেকে 50, ডিফল্ট 20। TikTok: সর্বোচ্চ 10।
cursorstringঐচ্ছিক
আগের পাতার next_cursor। শুধু YouTube।
include_detailsbooleanঐচ্ছিক
শুধু TikTok: প্রতি ভিডিওর লাইক, মন্তব্য, হ্যাশট্যাগ ও ক্যাপশনের ভাষাও আনুন।
YouTube খুঁজুন
curl -X POST https://www.transcriptdock.com/v1/video-discoveries \
-H "Authorization: Bearer td_live_YOUR_KEY" \
-H "Idempotency-Key: search-async-rust-1" \
-H "Content-Type: application/json" \
-d '{ "kind": "youtube_search", "query": "async rust", "limit": 5 }'

POST অনুরোধ 202 দিয়ে উত্তর দেয়, status: "queued" সহ। শেষ হওয়া GET /v1/video-discoveries/{id} দেখতে এমন:

200 রেসপন্স
{
"id": "55555555-5555-4555-8555-555555555555",
"kind": "youtube_search",
"status": "succeeded",
"request": { "kind": "youtube_search", "query": "async rust", "limit": 5 },
"videos": [
{
"platform": "youtube",
"video_id": "wXtngLBkK4Q",
"url": "https://www.youtube.com/watch?v=wXtngLBkK4Q",
"title": "Async Rust explained in 20 minutes",
"channel_id": "UCSp-OaMpsO8K0KkOqyBl7_w",
"channel_title": "Let's Get Rusty",
"duration_s": 1155,
"published_at": null,
"published_text": "5 months ago",
"view_count": 83635,
"view_count_text": "83,635 views",
"thumbnail_url": "https://i.ytimg.com/vi/wXtngLBkK4Q/hq720.jpg",
"tiktok": null
}
],
"profile": null,
"next_cursor": "opaque-token",
"error": null,
"created_at": "2026-09-16T12:00:00.000Z",
"updated_at": "2026-09-16T12:00:03.000Z",
"expires_at": "2026-09-17T12:00:00.000Z"
}

ভিডিওর ক্যাপশনের ভাষা#

POST/v1/language-discoveries

বডি { "source": { "url": "https://www.youtube.com/watch?v=..." } } সহ একটি Idempotency-Key (শুধু YouTube, 1 ক্রেডিট)। ক্যাপশন ট্র্যাকের কোড, সেগুলো নির্মাতার না স্বয়ংক্রিয়, এবং ডিফল্টটি জানতে GET /v1/language-discoveries/{id} পড়ুন। কোডগুলো caption_languages এ ব্যবহার করুন।

ব্যবহার ও সক্ষমতা#

GET/v1/usage
200 রেসপন্স
{
"plan": "pro",
"period_end": "2026-10-16T00:00:00.000Z",
"credits_remaining": 5840,
"credits_total": 6000,
"credits_reserved": 4,
"prepaid_credits": 0,
"transcribe_credits_per_minute": 2,
"minimum_billable_seconds": 60,
"subscription": {
"status": "active",
"interval": "yearly",
"cancel_at_period_end": false,
"current_period_end": "2027-09-16T00:00:00.000Z"
}
}

credits_remaining ইতিমধ্যে credits_reserved বাদ দিয়ে হিসাব করা (চলমান কাজের ধরে রাখা ক্রেডিট)। prepaid_credits হলো কেনা ক্রেডিট, যার মেয়াদ শেষ হয় না।

subscription হলো পেইড প্ল্যানের পেছনের Stripe সাবস্ক্রিপশন, আর প্ল্যান না থাকলে null। এতে আছে এর status, বিলিংয়ের interval (monthly বা yearly), cancel_at_period_end এবং current_period_end, অর্থাৎ প্ল্যান কবে নবায়ন হবে বা শেষ হবে। period_end হলো যখন মাসিক ক্রেডিট নতুন হয়; বার্ষিক প্ল্যানেও প্রতি মাসে।

GET/v1/capabilities

আপনার কী এখন কী করতে পারে: প্রতিটি উৎসের (youtube, tiktok, instagram, upload, direct) জন্য কোন মোডগুলো চালু, সাথে সীমা ও দাম। সরাসরি কোড না লিখে এটি পড়ুন; যেমন ট্রায়াল auto ও transcribe কে false হিসেবে দেখায়।

200 রেসপন্স
{
"youtube": { "enabled": true, "captions_only": true, "auto": true, "transcribe": true, "social_acquisition_fee": true },
"tiktok": { "enabled": true, "captions_only": true, "auto": true, "transcribe": true, "social_acquisition_fee": true },
"instagram": { "enabled": false, "captions_only": false, "auto": false, "transcribe": false, "social_acquisition_fee": true, "native_captions": "unverified_disabled" },
"upload": { "enabled": true, "captions_only": false, "auto": true, "transcribe": true, "social_acquisition_fee": false },
"direct": { "enabled": true, "captions_only": false, "auto": true, "transcribe": true, "social_acquisition_fee": false },
"max_duration_ms": 7200000,
"max_media_bytes": 262144000,
"export_formats": ["txt", "json", "srt", "vtt"],
"recognition_profiles": ["standard"],
"transcribe_credits_per_minute": 2,
"minimum_billable_seconds": 60,
"price_version": "2026-09-14",
"asr_enabled": true,
"instagram_enabled": false,
"free_caption_credits": 50,
"free_caption_credits_period": "month"
}

রেট সীমা#

প্ল্যানজমা / মিনিটচলমান কাজপড়া / মিনিট
ট্রায়াল1010120
Starter60100120
Pro120500120
Scale3002,000120

সীমা ছাড়ালে 429 RATE_LIMITED আসে, সাথে retry-after হেডার (সেকেন্ডে) এবং সীমার নাম সহ details.detail। কোনো চার্জ হয় না। ওয়েবহুক ও ?wait=25 ব্যবহার করলে পড়ার সীমা থেকে আপনি অনেক দূরে থাকেন।

ত্রুটি#

প্রতিটি ত্রুটির আকার একই। retryable: true মানে একই অনুরোধ পরে সফল হতে পারে: retry-after সেকেন্ড থাকলে তত সময় অপেক্ষা করুন, নাহলে কয়েক সেকেন্ড ব্যাকঅফ করুন, এবং একই Idempotency-Key আবার ব্যবহার করুন যেন কিছু ডুপ্লিকেট না হয়। অন্য যেকোনো ত্রুটির জন্য আপনার দিকে পরিবর্তন দরকার।

402 রেসপন্স
{
"error": {
"code": "INSUFFICIENT_BALANCE",
"message": "Not enough credits. Buy credits or upgrade your plan to continue.",
"retryable": false,
"details": { "detail": "This job needs more credits than you have left. Buy credits or upgrade your plan." },
"doc_url": "https://www.transcriptdock.com/docs/api-reference#error-codes"
},
"request_id": "66666666-6666-4666-8666-666666666666"
}

গ্রহণের পরে ব্যর্থ হওয়া কাজ GET /v1/jobs/{id} এ এখনো 200 ফেরত দেয়, সাথে status: "failed" এবং error এ একই ত্রুটি অবজেক্ট। ব্যর্থ কাজের জন্য কোনো চার্জ হয় না।

কোডসমূহ#

কোডHTTPআবার চেষ্টাঅর্থ ও কী করবেন
INVALID_REQUEST422নাA field is missing or has the wrong shape. details.detail names it.
INVALID_URL422নাThe URL is not a valid https link (max 2048 characters).
UNSUPPORTED_SOURCE422নাThe link is not a YouTube or TikTok video URL.
UNSAFE_URL422নাThe direct media link points at a private or blocked network address.
INVALID_CURSOR422নাA video discovery cursor expired or is malformed. Start again from the first page. A bad job list cursor returns INVALID_REQUEST.
CAPABILITY_UNAVAILABLE422নাThis mode is not available for this source. GET /v1/capabilities shows what is.
IDEMPOTENCY_CONFLICT409নাThis Idempotency-Key was already used with a different body. Use a new key.
UNAUTHENTICATED401নাNo valid API key or OAuth token in the Authorization header.
FORBIDDEN403নাThe key lacks the scope for this endpoint, or the workspace is disabled.
EMAIL_UNVERIFIED403নাVerify the account email before using the API.
NOT_FOUND404নাNo such object in this workspace.
INSUFFICIENT_BALANCE402নাNot enough credits for this job. Buy credits or upgrade.
PLAN_REQUIRED402নাThis needs a paid plan (AI transcription, larger batches) or the trial credits are used up.
BUDGET_EXCEEDED402নাThe measured cost is above max_credits. Nothing was charged; raise the cap or skip the media.
JOB_NOT_RETRYABLE409নাThe failure was final (private video, no captions). Fix the input and submit a new job.
CANCELLATION_NOT_ALLOWED409নাAI transcription already started; the job will finish.
RATE_LIMITED429হ্যাঁOver a rate or queue limit. Wait retry-after seconds; details.detail says which limit.
SOURCE_NOT_FOUND422নাThe video does not exist or was removed.
SOURCE_PRIVATE422নাThe video is private. Only public videos work.
SOURCE_AUTH_REQUIRED422নাThe video needs a login, age check or membership.
SOURCE_REGION_RESTRICTED422নাThe video is blocked in the regions we fetch from.
NO_CAPTIONS422নাNo captions on this video and mode was captions_only. Use auto or transcribe.
LANGUAGE_UNAVAILABLE422নাNone of caption_languages exists on this video. Drop the list to take the default track.
LANGUAGE_UNSUPPORTED422নাAI transcription does not support the requested language.
NO_SPEECH422নাAI transcription found no speech in the audio.
NO_AUDIO422নাThe media has no audio track.
INVALID_MEDIA422নাThe file could not be read as audio or video.
UNSUPPORTED_MEDIA422নাNot an audio or video file type.
DURATION_LIMIT_EXCEEDED413নাLonger than 2 hours.
FILE_TOO_LARGE413নাLarger than 250 MB.
TIMESTAMPS_UNAVAILABLE422নাThis transcript has no timings, so srt and vtt exports are unavailable. Use txt or json.
PROVIDER_REJECTED422নাThe AI transcription model could not process this audio.
SOURCE_RATE_LIMITED503হ্যাঁThe source platform is throttling us. The job retries automatically.
SOURCE_BLOCKED503হ্যাঁThe source platform blocked the fetch. The job retries automatically.
SOURCE_TIMEOUT503হ্যাঁThe source platform timed out. The job retries automatically.
SOURCE_CHANGED503হ্যাঁThe source changed while we read it. The job retries automatically.
PROVIDER_UNAVAILABLE503হ্যাঁAI transcription is temporarily unavailable. The job retries automatically.
STORAGE_UNAVAILABLE503হ্যাঁFile storage is temporarily unavailable. Retry the request.
INTERNAL_ERROR500হ্যাঁOur fault. Retry with the same Idempotency-Key; quote X-Request-Id if it persists.