← transcribe.soCONTENT HISTORY

Update to transcribe.so

Snapshot Nov 7, 2026 · 12:59 UTC · version 1.8.0

Collection source: downloaded plugin package.

WHAT CHANGED

Instructions updated for get-transcript

Skill instructions — Now says: takes the same options as `renderClip`, and the figure does not depend on the output or style. It does not check what the account can cover or how many...

Observed in instructions or declared skills. Runtime behavior has not been tested.

Save transcribe.so and check future changes in Following.

Up to 3 plugins free · no card required.

All fields and original values.

Skill instructions

Before

Oct 24, 2026 · 13:41 UTC

does not check what the account can cover or how many clips are already rendering; `renderClip` enforces those when it runs. - `renderClip`: hosted captioned MP4 of a 1-60 s range of a completed transcription with word timestamps. A ...

After

Nov 7, 2026 · 12:59 UTC

takes the same options as `renderClip`, and the figure does not depend on the output or style. It does not check what the account can cover or how many clips are already rendering; `renderClip` enforces those when it runs. - `rende...

Compare saved observations

Download comparison JSON

SKILL.md text changes

− removed · + added

--- before
+++ after
@@ -47,11 +47,24 @@
   and returns `charge_usd` (what `renderClip` would use from the user's
   existing transcribe.so account for that range) plus the normalized range and
   `clip_seconds`. It runs the same range checks as `renderClip`, so it doubles
-  as a dry run. It does not check what the account can cover or how many
-  clips are already rendering; `renderClip` enforces those when it runs.
-- `renderClip`: hosted captioned MP4 of a 1-60 s range of a completed
-  transcription with word timestamps. A clip always uses the account, so
-  first call `getClipQuote` for the same range, tell the user its
+  as a dry run. It takes the same options as `renderClip`, and the figure
+  does not depend on the output or style. It does not check what the account
+  can cover or how many clips are already rendering; `renderClip` enforces
+  those when it runs.
+- `renderClip`: hosted clip of a 1-60 s range (up to 180 s where enabled) of
+  a completed transcription with word timestamps. `output`: `audiogram`
+  (default: MP4 with captions over a generated background), `video` (the
+  source video with captions burned in) or `audio` (M4A, no captions).
+  Video needs the source video: for a link source pass `rights_affirmed:
+  true` only after the user confirms they own the video or may reuse it (else
+  `invalid_request` with `error.reason: rights_required`); for an upload, the
+  original video must first be added in the web app. `video_unavailable`
+  means video cannot be made for this transcription: offer the audiogram,
+  which still works. `style`, `caption_position`, `words_per_line`,
+  `highlight_color` and `framing` tune the result; an option the server does
+  not offer is refused with `invalid_request` and `error.reason:
+  feature_unavailable` before anything is held. A clip always uses the
+  account, so first call `getClipQuote` for the same range, tell the user its
   `charge_usd` and wait for a go-ahead, unless it is within a limit the user
   already gave. Pass the agreed figure as `max_charge_usd`. If the real
   figure is higher the call is refused with `max_charge_exceeded` before
@@ -79,8 +92,11 @@
     original arguments, or check `getClip`, before rendering again; never
     switch keys just to get past that rejection.
 - `getClip`: pass `wait_seconds` (up to 45) to long-poll; `completed`
-  carries a presigned `mp4_url` valid one hour (call again for a fresh one).
-  Renders take several times the clip length; expect multiple calls.
+  carries `file_url`, a presigned link valid one hour (call again for a
+  fresh one): an MP4 for audiogram or video (also in `mp4_url`) or an M4A
+  for audio (`mp4_url` is null then). `srt_url` holds the captions when they
+  were made. A video clip may first wait for its source video; expect
+  multiple calls.
 
 ## Live Q&A (daily allowance)
 
Full technical diff · 1 changed fields

changed /skill_md_contents

BEFORE
"---\nname: get-transcript\ndescription: \"Retrieve a finished transcription from transcribe.so: chapters, sections, cited Q&A, speaker-labelled timestamped segments, word-level timings, subtitle files (SRT/VTT/karaoke), paste-ready timestamps, hosted captioned MP4 clips, and live cited Q&A over one transcription or the whole library. Use when the user asks for a transcript, subtitles, show notes, quotes, clips, or answers grounded in their recordings.\"\n---\n\n# Get a transcript and derived artifacts\n\nAll tools below live on the bundled `transcribe-so` MCP server. They work for\njobs submitted from this plugin, the REST API, or the transcribe.so web app:\nsame library everywhere.\n\n## Reading results\n\n- `getTranscriptionResult`: the main read. `include` defaults to\n  `chapters,sections,qna`; add `segments` (speaker-labelled\n  `{start_seconds, end_seconds, speaker, text}`), `acts`, `posting_chapters`,\n  or `all`. There is no single full-text field: join segments (or sections).\n- `waitForTranscription`: long-poll a running job (~90 s per call;\n  `_timed_out: true` = call again).\n- `search`: keyword search over titles and transcript text across the\n  user's library; `fetch`: one transcription as plain text.\n- `searchSegments`: \"who said X, and when\": each hit is the SEGMENT, with its\n  own speaker label, `start_ms`/`end_ms` and a deep-link `url`. Speaker labels\n  are recording-local and `null` means unknown; never attribute a `null` line.\n- `getTranscript`: the transcript as one text body (`txt` or `md`), built\n  from every segment; the source is never capped. The inline `content` is cut\n  at this tool's response budget: when `truncated` is true it is a prefix and\n  only `download_url` is complete. Use this for full text, not a windowed\n  `segments` read.\n- `getTranscriptionTimestamps`: paste-ready chapter timestamps (formats:\n  youtube, spotify, apple_podcasts, markdown, x, threads, instagram_caption,\n  linkedin, plain; variants: standard, highlights, clips, quoted_sections,\n  show_notes, original). `cta` is opt-in and off by default. `not_ready` with\n  `reason: \"artifact_missing\"` is fixed by ONE `regeneratePostingChapters`\n  call.\n- `getTranscriptionWords`: paginated word-level timings in ms (limit up to\n  2000/page; check `available`; `no_word_timestamps` means sentence-level\n  only). For karaoke captions and overlays, not for reading.\n- `getSubtitles`: SRT / VTT / karaoke VTT / JSON subtitle file (`content`\n  inline up to 60k chars, `download_url` beyond; presets: youtube,\n  tiktok-shorts, instagram-reels, netflix, podcast, broadcast).\n\n## Clips\n\n- `getClipQuote`: preview before rendering. Pass `transcription_id`,\n  `start_seconds` and `end_seconds`; it renders nothing and writes nothing,\n  and returns `charge_usd` (what `renderClip` would use from the user's\n  existing transcribe.so account for that range) plus the normalized range and\n  `clip_seconds`. It runs the same range checks as `renderClip`, so it doubles\n  as a dry run. It does not check what the account can cover or how many\n  clips are already rendering; `renderClip` enforces those when it runs.\n- `renderClip`: hosted captioned MP4 of a 1-60 s range of a completed\n  transcription with word timestamps. A clip always uses the account, so\n  first call `getClipQuote` for the same range, tell the user its\n  `charge_usd` and wait for a go-ahead, unless it is within a limit the user\n  already gave. Pass the agreed figure as `max_charge_usd`. If the real\n  figure is higher the call is refused with `max_charge_exceeded` before\n  anything is held and nothing is rendered: report the figure and ask; do not\n  raise the ceiling yourself.\n  Retries: pass `idempotency_key`; without one `renderClip` is not idempotent\n  (check `getClip` before retrying a timed-out call). Keep the SAME key\n  unless the NEW-key case below applies:\n  - SAME key: a retry with the same arguments replays the first result. A\n    `not_ready` saying a request with this key is already in flight also\n    keeps the same key, and so does one saying the earlier request just\n    completed with an error (nothing was recorded). If the in-flight answer\n    carries `stale: true` (no result recorded after 120 seconds), a clip may\n    already have been rendered and drawn: do not send a new key on your own;\n    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 drawn, once its cause is fixed (for example\n    `max_charge_exceeded` or `insufficient_funds` after the user resolved it,\n    `not_ready` once the transcription has completed, `rate_limited` once\n    clips in flight have finished; check with `getClip`). Changed arguments\n    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 to\n    the first call: it may have gone through. Re-send the SAME key with the\n    original arguments, or check `getClip`, before rendering again; never\n    switch keys just to get past that rejection.\n- `getClip`: pass `wait_seconds` (up to 45) to long-poll; `completed`\n  carries a presigned `mp4_url` valid one hour (call again for a fresh one).\n  Renders take several times the clip length; expect multiple calls.\n\n## Live Q&A (daily allowance)\n\n- `askTranscription` (one transcription) and `askLibrary` (whole library or\n  up to 50 ids) return a markdown `answer` with `[N]` markers plus\n  `citations[]` carrying deep-link `url` + `start_seconds`; render those.\n  Each call takes ~10 s and consumes the account's daily Q&A allowance;\n  `no_answer: true` consumes nothing. Cached pairs from\n  `getTranscriptionResult include=[\"qna\"]` do not consume the allowance; read\n  those first.\n\n## Authentication\n\nOAuth 2.0 (automatic browser flow) or a `tsk_live_*` API key as Bearer.\nGuide: https://transcribe.so/auth.md\n\n## Related\n\n- Submit new jobs: see the `transcribe-audio` skill\n- REST shapes: https://transcribe.so/api/v1/openapi.yaml\n"
AFTER
"---\nname: get-transcript\ndescription: \"Retrieve a finished transcription from transcribe.so: chapters, sections, cited Q&A, speaker-labelled timestamped segments, word-level timings, subtitle files (SRT/VTT/karaoke), paste-ready timestamps, hosted captioned MP4 clips, and live cited Q&A over one transcription or the whole library. Use when the user asks for a transcript, subtitles, show notes, quotes, clips, or answers grounded in their recordings.\"\n---\n\n# Get a transcript and derived artifacts\n\nAll tools below live on the bundled `transcribe-so` MCP server. They work for\njobs submitted from this plugin, the REST API, or the transcribe.so web app:\nsame library everywhere.\n\n## Reading results\n\n- `getTranscriptionResult`: the main read. `include` defaults to\n  `chapters,sections,qna`; add `segments` (speaker-labelled\n  `{start_seconds, end_seconds, speaker, text}`), `acts`, `posting_chapters`,\n  or `all`. There is no single full-text field: join segments (or sections).\n- `waitForTranscription`: long-poll a running job (~90 s per call;\n  `_timed_out: true` = call again).\n- `search`: keyword search over titles and transcript text across the\n  user's library; `fetch`: one transcription as plain text.\n- `searchSegments`: \"who said X, and when\": each hit is the SEGMENT, with its\n  own speaker label, `start_ms`/`end_ms` and a deep-link `url`. Speaker labels\n  are recording-local and `null` means unknown; never attribute a `null` line.\n- `getTranscript`: the transcript as one text body (`txt` or `md`), built\n  from every segment; the source is never capped. The inline `content` is cut\n  at this tool's response budget: when `truncated` is true it is a prefix and\n  only `download_url` is complete. Use this for full text, not a windowed\n  `segments` read.\n- `getTranscriptionTimestamps`: paste-ready chapter timestamps (formats:\n  youtube, spotify, apple_podcasts, markdown, x, threads, instagram_caption,\n  linkedin, plain; variants: standard, highlights, clips, quoted_sections,\n  show_notes, original). `cta` is opt-in and off by default. `not_ready` with\n  `reason: \"artifact_missing\"` is fixed by ONE `regeneratePostingChapters`\n  call.\n- `getTranscriptionWords`: paginated word-level timings in ms (limit up to\n  2000/page; check `available`; `no_word_timestamps` means sentence-level\n  only). For karaoke captions and overlays, not for reading.\n- `getSubtitles`: SRT / VTT / karaoke VTT / JSON subtitle file (`content`\n  inline up to 60k chars, `download_url` beyond; presets: youtube,\n  tiktok-shorts, instagram-reels, netflix, podcast, broadcast).\n\n## Clips\n\n- `getClipQuote`: preview before rendering. Pass `transcription_id`,\n  `start_seconds` and `end_seconds`; it renders nothing and writes nothing,\n  and returns `charge_usd` (what `renderClip` would use from the user's\n  existing transcribe.so account for that range) plus the normalized range and\n  `clip_seconds`. It runs the same range checks as `renderClip`, so it doubles\n  as a dry run. It takes the same options as `renderClip`, and the figure\n  does not depend on the output or style. It does not check what the account\n  can cover or how many clips are already rendering; `renderClip` enforces\n  those when it runs.\n- `renderClip`: hosted clip of a 1-60 s range (up to 180 s where enabled) of\n  a completed transcription with word timestamps. `output`: `audiogram`\n  (default: MP4 with captions over a generated background), `video` (the\n  source video with captions burned in) or `audio` (M4A, no captions).\n  Video needs the source video: for a link source pass `rights_affirmed:\n  true` only after the user confirms they own the video or may reuse it (else\n  `invalid_request` with `error.reason: rights_required`); for an upload, the\n  original video must first be added in the web app. `video_unavailable`\n  means video cannot be made for this transcription: offer the audiogram,\n  which still works. `style`, `caption_position`, `words_per_line`,\n  `highlight_color` and `framing` tune the result; an option the server does\n  not offer is refused with `invalid_request` and `error.reason:\n  feature_unavailable` before anything is held. A clip always uses the\n  account, so first call `getClipQuote` for the same range, tell the user its\n  `charge_usd` and wait for a go-ahead, unless it is within a limit the user\n  already gave. Pass the agreed figure as `max_charge_usd`. If the real\n  figure is higher the call is refused with `max_charge_exceeded` before\n  anything is held and nothing is rendered: report the figure and ask; do not\n  raise the ceiling yourself.\n  Retries: pass `idempotency_key`; without one `renderClip` is not idempotent\n  (check `getClip` before retrying a timed-out call). Keep the SAME key\n  unless the NEW-key case below applies:\n  - SAME key: a retry with the same arguments replays the first result. A\n    `not_ready` saying a request with this key is already in flight also\n    keeps the same key, and so does one saying the earlier request just\n    completed with an error (nothing was recorded). If the in-flight answer\n    carries `stale: true` (no result recorded after 120 seconds), a clip may\n    already have been rendered and drawn: do not send a new key on your own;\n    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 drawn, once its cause is fixed (for example\n    `max_charge_exceeded` or `insufficient_funds` after the user resolved it,\n    `not_ready` once the transcription has completed, `rate_limited` once\n    clips in flight have finished; check with `getClip`). Changed arguments\n    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 to\n    the first call: it may have gone through. Re-send the SAME key with the\n    original arguments, or check `getClip`, before rendering again; never\n    switch keys just to get past that rejection.\n- `getClip`: pass `wait_seconds` (up to 45) to long-poll; `completed`\n  carries `file_url`, a presigned link valid one hour (call again for a\n  fresh one): an MP4 for audiogram or video (also in `mp4_url`) or an M4A\n  for audio (`mp4_url` is null then). `srt_url` holds the captions when they\n  were made. A video clip may first wait for its source video; expect\n  multiple calls.\n\n## Live Q&A (daily allowance)\n\n- `askTranscription` (one transcription) and `askLibrary` (whole library or\n  up to 50 ids) return a markdown `answer` with `[N]` markers plus\n  `citations[]` carrying deep-link `url` + `start_seconds`; render those.\n  Each call takes ~10 s and consumes the account's daily Q&A allowance;\n  `no_answer: true` consumes nothing. Cached pairs from\n  `getTranscriptionResult include=[\"qna\"]` do not consume the allowance; read\n  those first.\n\n## Authentication\n\nOAuth 2.0 (automatic browser flow) or a `tsk_live_*` API key as Bearer.\nGuide: https://transcribe.so/auth.md\n\n## Related\n\n- Submit new jobs: see the `transcribe-audio` skill\n- REST shapes: https://transcribe.so/api/v1/openapi.yaml\n"
Full snapshot data
{
  "description": "Retrieve a finished transcription from transcribe.so: chapters, sections, cited Q&A, speaker-labelled timestamped segments, word-level timings, subtitle files (SRT/VTT/karaoke), paste-ready timestamps, hosted captioned MP4 clips, and live cited Q&A over one transcription or the whole library. Use when the user asks for a transcript, subtitles, show notes, quotes, clips, or answers grounded in their recordings.",
  "included_files": [],
  "name": "get-transcript",
  "skill_md_contents": "---\nname: get-transcript\ndescription: \"Retrieve a finished transcription from transcribe.so: chapters, sections, cited Q&A, speaker-labelled timestamped segments, word-level timings, subtitle files (SRT/VTT/karaoke), paste-ready timestamps, hosted captioned MP4 clips, and live cited Q&A over one transcription or the whole library. Use when the user asks for a transcript, subtitles, show notes, quotes, clips, or answers grounded in their recordings.\"\n---\n\n# Get a transcript and derived artifacts\n\nAll tools below live on the bundled `transcribe-so` MCP server. They work for\njobs submitted from this plugin, the REST API, or the transcribe.so web app:\nsame library everywhere.\n\n## Reading results\n\n- `getTranscriptionResult`: the main read. `include` defaults to\n  `chapters,sections,qna`; add `segments` (speaker-labelled\n  `{start_seconds, end_seconds, speaker, text}`), `acts`, `posting_chapters`,\n  or `all`. There is no single full-text field: join segments (or sections).\n- `waitForTranscription`: long-poll a running job (~90 s per call;\n  `_timed_out: true` = call again).\n- `search`: keyword search over titles and transcript text across the\n  user's library; `fetch`: one transcription as plain text.\n- `searchSegments`: \"who said X, and when\": each hit is the SEGMENT, with its\n  own speaker label, `start_ms`/`end_ms` and a deep-link `url`. Speaker labels\n  are recording-local and `null` means unknown; never attribute a `null` line.\n- `getTranscript`: the transcript as one text body (`txt` or `md`), built\n  from every segment; the source is never capped. The inline `content` is cut\n  at this tool's response budget: when `truncated` is true it is a prefix and\n  only `download_url` is complete. Use this for full text, not a windowed\n  `segments` read.\n- `getTranscriptionTimestamps`: paste-ready chapter timestamps (formats:\n  youtube, spotify, apple_podcasts, markdown, x, threads, instagram_caption,\n  linkedin, plain; variants: standard, highlights, clips, quoted_sections,\n  show_notes, original). `cta` is opt-in and off by default. `not_ready` with\n  `reason: \"artifact_missing\"` is fixed by ONE `regeneratePostingChapters`\n  call.\n- `getTranscriptionWords`: paginated word-level timings in ms (limit up to\n  2000/page; check `available`; `no_word_timestamps` means sentence-level\n  only). For karaoke captions and overlays, not for reading.\n- `getSubtitles`: SRT / VTT / karaoke VTT / JSON subtitle file (`content`\n  inline up to 60k chars, `download_url` beyond; presets: youtube,\n  tiktok-shorts, instagram-reels, netflix, podcast, broadcast).\n\n## Clips\n\n- `getClipQuote`: preview before rendering. Pass `transcription_id`,\n  `start_seconds` and `end_seconds`; it renders nothing and writes nothing,\n  and returns `charge_usd` (what `renderClip` would use from the user's\n  existing transcribe.so account for that range) plus the normalized range and\n  `clip_seconds`. It runs the same range checks as `renderClip`, so it doubles\n  as a dry run. It takes the same options as `renderClip`, and the figure\n  does not depend on the output or style. It does not check what the account\n  can cover or how many clips are already rendering; `renderClip` enforces\n  those when it runs.\n- `renderClip`: hosted clip of a 1-60 s range (up to 180 s where enabled) of\n  a completed transcription with word timestamps. `output`: `audiogram`\n  (default: MP4 with captions over a generated background), `video` (the\n  source video with captions burned in) or `audio` (M4A, no captions).\n  Video needs the source video: for a link source pass `rights_affirmed:\n  true` only after the user confirms they own the video or may reuse it (else\n  `invalid_request` with `error.reason: rights_required`); for an upload, the\n  original video must first be added in the web app. `video_unavailable`\n  means video cannot be made for this transcription: offer the audiogram,\n  which still works. `style`, `caption_position`, `words_per_line`,\n  `highlight_color` and `framing` tune the result; an option the server does\n  not offer is refused with `invalid_request` and `error.reason:\n  feature_unavailable` before anything is held. A clip always uses the\n  account, so first call `getClipQuote` for the same range, tell the user its\n  `charge_usd` and wait for a go-ahead, unless it is within a limit the user\n  already gave. Pass the agreed figure as `max_charge_usd`. If the real\n  figure is higher the call is refused with `max_charge_exceeded` before\n  anything is held and nothing is rendered: report the figure and ask; do not\n  raise the ceiling yourself.\n  Retries: pass `idempotency_key`; without one `renderClip` is not idempotent\n  (check `getClip` before retrying a timed-out call). Keep the SAME key\n  unless the NEW-key case below applies:\n  - SAME key: a retry with the same arguments replays the first result. A\n    `not_ready` saying a request with this key is already in flight also\n    keeps the same key, and so does one saying the earlier request just\n    completed with an error (nothing was recorded). If the in-flight answer\n    carries `stale: true` (no result recorded after 120 seconds), a clip may\n    already have been rendered and drawn: do not send a new key on your own;\n    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 drawn, once its cause is fixed (for example\n    `max_charge_exceeded` or `insufficient_funds` after the user resolved it,\n    `not_ready` once the transcription has completed, `rate_limited` once\n    clips in flight have finished; check with `getClip`). Changed arguments\n    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 to\n    the first call: it may have gone through. Re-send the SAME key with the\n    original arguments, or check `getClip`, before rendering again; never\n    switch keys just to get past that rejection.\n- `getClip`: pass `wait_seconds` (up to 45) to long-poll; `completed`\n  carries `file_url`, a presigned link valid one hour (call again for a\n  fresh one): an MP4 for audiogram or video (also in `mp4_url`) or an M4A\n  for audio (`mp4_url` is null then). `srt_url` holds the captions when they\n  were made. A video clip may first wait for its source video; expect\n  multiple calls.\n\n## Live Q&A (daily allowance)\n\n- `askTranscription` (one transcription) and `askLibrary` (whole library or\n  up to 50 ids) return a markdown `answer` with `[N]` markers plus\n  `citations[]` carrying deep-link `url` + `start_seconds`; render those.\n  Each call takes ~10 s and consumes the account's daily Q&A allowance;\n  `no_answer: true` consumes nothing. Cached pairs from\n  `getTranscriptionResult include=[\"qna\"]` do not consume the allowance; read\n  those first.\n\n## Authentication\n\nOAuth 2.0 (automatic browser flow) or a `tsk_live_*` API key as Bearer.\nGuide: https://transcribe.so/auth.md\n\n## Related\n\n- Submit new jobs: see the `transcribe-audio` skill\n- REST shapes: https://transcribe.so/api/v1/openapi.yaml\n"
}

SHA-256 of public snapshot: b14585e9a5bc488cd216042ec1ea0f0a5ec31667e67a694e6490372ae7df6729