सीधे कंटेंट पर जाएं
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एक कमांड से Transcript Dock, Claude Code में जुड़ जाता है।
Claude ऐपTranscript Dock को claude.ai, Claude Desktop या मोबाइल पर कस्टम कनेक्टर के रूप में जोड़ें।
CursorCursor में Transcript Dock को MCP सर्वर के रूप में जोड़ें।
WindsurfTranscript Dock को Windsurf में जोड़ें, ताकि Cascade वीडियो खोज और ट्रांसक्राइब कर सके।
OpenClawTranscript Dock को OpenClaw के ऑटोनॉमस एजेंटों से जोड़ें।
19 परिणाम
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 मिलता है। अच्छी कुंजी वही है जो आपके ट्रांसक्राइब किए जा रहे आइटम की अपनी id हो।

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-discoveriesYouTube वीडियो की कैप्शन भाषाओं की सूची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वैकल्पिक
जॉब की id।
statusstringवैकल्पिक
queued → processing (AI ट्रांसक्रिप्शन के दौरान → awaiting_provider) → succeeded, failed या cancelled। आखिरी तीन अंतिम स्थितियां हैं।
stagestring | nullवैकल्पिक
चल रहा जॉब कहां है: resolve, captions, acquire_audio, submit_asr, wait_asr, finalize। सिर्फ़ जानकारी के लिए।
result_iduuid | nullवैकल्पिक
सफल होने पर, ट्रांसक्रिप्ट की id।
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 को जॉब में दें। डिस्कवरी जॉब की तरह बैकग्राउंड में चलती है: उसे GET /v1/video-discoveries/{id} से तब तक पढ़ें जब तक status succeeded न हो जाए। प्रति पेज 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, चैनल id या चैनल URL (चैनल वाले kind)।
playliststringवैकल्पिक
प्लेलिस्ट id या 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नहींकोई फ़ील्ड गायब है या उसका आकार गलत है। details.detail उसका नाम बताता है।
INVALID_URL422नहींURL मान्य https लिंक नहीं है (ज़्यादा से ज़्यादा 2048 अक्षर)।
UNSUPPORTED_SOURCE422नहींलिंक YouTube या TikTok वीडियो का URL नहीं है।
UNSAFE_URL422नहींसीधा मीडिया लिंक किसी निजी या ब्लॉक किए गए नेटवर्क पते की ओर जाता है।
INVALID_CURSOR422नहींवीडियो डिस्कवरी का कर्सर एक्सपायर हो गया है या गलत बना है। पहले पेज से फिर शुरू करें। जॉब सूची का गलत कर्सर INVALID_REQUEST लौटाता है।
CAPABILITY_UNAVAILABLE422नहींयह मोड इस सोर्स के लिए उपलब्ध नहीं है। GET /v1/capabilities दिखाता है कि क्या उपलब्ध है।
IDEMPOTENCY_CONFLICT409नहींयह Idempotency-Key पहले किसी दूसरी बॉडी के साथ इस्तेमाल हो चुकी है। नई कुंजी इस्तेमाल करें।
UNAUTHENTICATED401नहींAuthorization हेडर में कोई मान्य API कुंजी या OAuth टोकन नहीं है।
FORBIDDEN403नहींकुंजी के पास इस एंडपॉइंट का स्कोप नहीं है, या वर्कस्पेस बंद है।
EMAIL_UNVERIFIED403नहींAPI इस्तेमाल करने से पहले खाते का ईमेल वेरिफ़ाई करें।
NOT_FOUND404नहींइस वर्कस्पेस में ऐसा कोई ऑब्जेक्ट नहीं है।
INSUFFICIENT_BALANCE402नहींइस जॉब के लिए क्रेडिट काफ़ी नहीं हैं। क्रेडिट खरीदें या प्लान अपग्रेड करें।
PLAN_REQUIRED402नहींइसके लिए पेड प्लान चाहिए (AI ट्रांसक्रिप्शन, बड़े बैच) या ट्रायल के क्रेडिट खत्म हो चुके हैं।
BUDGET_EXCEEDED402नहींनापी गई कीमत max_credits से ज़्यादा है। कुछ नहीं कटा; सीमा बढ़ाएं या वह मीडिया छोड़ दें।
JOB_NOT_RETRYABLE409नहींफेल होना अंतिम था (निजी वीडियो, कैप्शन नहीं)। इनपुट ठीक करें और नया जॉब सबमिट करें।
CANCELLATION_NOT_ALLOWED409नहींAI ट्रांसक्रिप्शन शुरू हो चुका है; जॉब पूरा होगा।
RATE_LIMITED429हांरेट या कतार की सीमा पार हो गई। retry-after सेकंड रुकें; details.detail बताता है कि कौन सी सीमा।
SOURCE_NOT_FOUND422नहींवीडियो मौजूद नहीं है या हटा दिया गया है।
SOURCE_PRIVATE422नहींवीडियो निजी है। सिर्फ़ सार्वजनिक वीडियो चलते हैं।
SOURCE_AUTH_REQUIRED422नहींवीडियो के लिए लॉगिन, उम्र की जांच या मेंबरशिप चाहिए।
SOURCE_REGION_RESTRICTED422नहींजिन क्षेत्रों से हम फ़ेच करते हैं, वहां वीडियो ब्लॉक है।
NO_CAPTIONS422नहींइस वीडियो में कैप्शन नहीं हैं और mode captions_only था। auto या transcribe इस्तेमाल करें।
LANGUAGE_UNAVAILABLE422नहींcaption_languages में से कोई भी भाषा इस वीडियो में नहीं है। सूची हटाएं, ताकि डिफ़ॉल्ट ट्रैक लिया जाए।
LANGUAGE_UNSUPPORTED422नहींAI ट्रांसक्रिप्शन मांगी गई भाषा को सपोर्ट नहीं करता।
NO_SPEECH422नहींAI ट्रांसक्रिप्शन को ऑडियो में कोई आवाज़ नहीं मिली।
NO_AUDIO422नहींमीडिया में ऑडियो ट्रैक नहीं है।
INVALID_MEDIA422नहींफ़ाइल को ऑडियो या वीडियो के रूप में पढ़ा नहीं जा सका।
UNSUPPORTED_MEDIA422नहींयह ऑडियो या वीडियो फ़ाइल का प्रकार नहीं है।
DURATION_LIMIT_EXCEEDED413नहीं2 घंटे से लंबा।
FILE_TOO_LARGE413नहीं250 MB से बड़ा।
TIMESTAMPS_UNAVAILABLE422नहींइस ट्रांसक्रिप्ट में समय नहीं हैं, इसलिए srt और vtt एक्सपोर्ट उपलब्ध नहीं हैं। txt या json इस्तेमाल करें।
PROVIDER_REJECTED422नहींAI ट्रांसक्रिप्शन मॉडल इस ऑडियो को प्रोसेस नहीं कर सका।
SOURCE_RATE_LIMITED503हांसोर्स प्लेटफ़ॉर्म हमारी रफ़्तार सीमित कर रहा है। जॉब अपने आप दोबारा कोशिश करता है।
SOURCE_BLOCKED503हांसोर्स प्लेटफ़ॉर्म ने फ़ेच ब्लॉक कर दिया। जॉब अपने आप दोबारा कोशिश करता है।
SOURCE_TIMEOUT503हांसोर्स प्लेटफ़ॉर्म का टाइमआउट हो गया। जॉब अपने आप दोबारा कोशिश करता है।
SOURCE_CHANGED503हांहमारे पढ़ते समय सोर्स बदल गया। जॉब अपने आप दोबारा कोशिश करता है।
PROVIDER_UNAVAILABLE503हांAI ट्रांसक्रिप्शन फ़िलहाल उपलब्ध नहीं है। जॉब अपने आप दोबारा कोशिश करता है।
STORAGE_UNAVAILABLE503हांफ़ाइल स्टोरेज फ़िलहाल उपलब्ध नहीं है। अनुरोध फिर से भेजें।
INTERNAL_ERROR500हांहमारी गलती। वही Idempotency-Key लेकर फिर कोशिश करें; बनी रहे तो X-Request-Id बताएं।