{"id":49919,"plugin_id":"plugin_asdk_app_6abdf8e086608191944bc78ebef760d8","kind":"skill","collection_source":"plugin_package","comparison_source":null,"observed_at":"2026-10-24T13:41:39.773Z","digest":"48285e436013a69bb51301d84342ad53191365225f63ead8c62f1e7f580de9f0","against":null,"payload":{"description":"Transcribe audio or video from a YouTube URL, platform URL (Apple Podcasts, SoundCloud, Vimeo, Twitch, Loom), direct file URL, or local file upload into speaker-labelled, timestamped segments with chapters, sections, and cited Q&A. Use when the user wants a transcript, show notes, chapters, or analysis of any recording.","included_files":[],"name":"transcribe-audio","skill_md_contents":"---\nname: transcribe-audio\ndescription: Transcribe audio or video from a YouTube URL, platform URL (Apple Podcasts, SoundCloud, Vimeo, Twitch, Loom), direct file URL, or local file upload into speaker-labelled, timestamped segments with chapters, sections, and cited Q&A. Use when the user wants a transcript, show notes, chapters, or analysis of any recording.\n---\n\n# Transcribe audio or video\n\nThe bundled `transcribe-so` MCP server turns recordings into speaker-labelled,\ntimestamped transcripts with automatic chapters, sections, and cited Q&A.\n\n## Sources\n\n- `youtube`: a YouTube video URL\n- `platform_url`: a public page URL on a supported platform (Apple Podcasts,\n  SoundCloud, Vimeo, Twitch, Loom and similar)\n- `external_url`: a direct http(s) link to an audio or video file\n- `upload`: a local file (shell agents only): call `createUpload` for a presigned PUT URL\n  (15 minute TTL), PUT the bytes, then pass the returned `upload_id` together\n  with `duration_seconds`\n\n## Flow\n\n1. Preview before creating a job: call `getQuote` first. It starts nothing;\n   it returns the length, the detected title and what the job would use from\n   the user's existing transcribe.so account (`retail_usd`, 0 when the account\n   already includes it). When `retail_usd` is 0, or within a limit the user\n   already gave, go ahead; otherwise tell the user the figure and wait for a\n   go-ahead. Pass the figure the user agreed to as `max_charge_usd` to\n   `transcribe`; the server enforces it: if the real figure is higher the call\n   is refused with `max_charge_exceeded` and nothing is started. Report the\n   refused figure and ask; do not raise the ceiling yourself.\n2. Call `transcribe` with the source. It returns `id` immediately; jobs are\n   asynchronous.\n3. For short recordings, long-poll with `waitForTranscription` (each call\n   covers ~90 s; `_timed_out: true` means still processing; call it again,\n   this is the expected loop, not an error). For long recordings, hand the\n   user the dashboard link (https://transcribe.so/transcriptions); they also\n   get a completion email.\n4. Retries: pass `idempotency_key`; without one `transcribe` is not idempotent\n   (check `listTranscriptions` before retrying a timed-out call). Keep the\n   SAME key unless one of the NEW-key cases below applies:\n   - SAME key: a retry with the same arguments replays the first result.\n     After `queue_full` or a server error (neither is stored under the key),\n     wait `retry_after` seconds first. If reading the source took longer than\n     45 seconds, retry the same key once; if that is refused the same way,\n     stop and tell the user (for `external_url`, pass `duration_seconds` if\n     you know the length). On `not_ready` saying the earlier call is already\n     in flight, it is still running and the server ends its preview within\n     45 seconds: keep retrying the same key. A `not_ready` saying the earlier\n     request just completed with an error recorded nothing: retry, same key.\n   - `not_ready` with `stale: true` (no result recorded after 120 seconds):\n     check `listTranscriptions` for the `client_reference` you sent. A job\n     there in ANY status counts as found, so do not create another; if it is\n     still `quoted` (not started yet), tell the user. Only if none is listed\n     use a new key. If you sent no `client_reference`, do not switch keys on\n     your own: tell the user.\n   - NEW key: refusals are replayed under the key for 24 hours too, so a new\n     key is needed only after a refusal you actually received that says\n     nothing was started, once its cause is fixed (for example\n     `insufficient_funds` or `max_charge_exceeded` after the user resolved\n     it, or a corrected input), or in the `stale` case above. Changed\n     arguments after such a refusal are a new request and take the new key.\n   - Key rejected because the arguments differ, and you never got an answer\n     to the first call: it may have gone through. Re-send the SAME key with\n     the original arguments to get that result back, or check\n     `listTranscriptions` / `getTranscription`, before transcribing again;\n     never switch keys just to get past that rejection.\n\nAgents with their own public endpoint can pass `callback_url` to `transcribe`\nto receive a signed `transcription.completed` / `transcription.failed`\nwebhook instead of polling (the per-job HMAC secret comes back as\n`callback.secret`).\n\n## Authentication\n\nThe MCP server authenticates via OAuth 2.0 (browser flow starts automatically\non first use) or a `tsk_live_*` API key from\nhttps://transcribe.so/settings/api-keys sent as the Bearer token.\n\n## Related\n\n- Retrieve results, subtitles, clips, Q&A: see the `get-transcript` skill\n- REST equivalent of everything here: https://transcribe.so/api/v1/openapi.yaml\n- Developer docs: https://transcribe.so/developers/docs\n"},"changes":[],"summary":"First saved snapshot. No earlier version is available for comparison.","summary_kind":"deterministic","summary_metadata":{}}