← Speak AICONTENT HISTORY
WHAT CHANGED
Update to Speak AI
Snapshot Nov 2, 2026 · 18:11 UTC · version 1.41.1
Collection source: downloaded plugin package.
First saved snapshot
No earlier snapshot is available to establish a change.
Save Speak AI and check future changes in Following.
Up to 10 plugins free · no card required.
Compare saved observations
Download comparison JSONFull technical diff · 0 changed fields
Full snapshot data
{
"description": "Import public social and video links into Speak AI and read the results. Use this when someone pastes a YouTube, TikTok, Instagram, X, Facebook, Reddit, SoundCloud, Twitch, Dailymotion, Streamable, Snapchat, Pinterest, Tumblr, Bilibili, VK, OK.ru or Rutube link and wants it transcribed, summarized, analyzed or compared, when they hand over a list of links to process together, or when a link import fails and you need to tell them why. Covers which tool to call, what to pass for mediaType, how the batch import paces itself, and which failures are worth retrying. Uses upload_and_analyze, upload_and_analyze_batch, get_media_status, get_transcript, get_media_insights and list_media.",
"included_files": [
{
"relative_path": "agents/openai.yaml",
"size_in_bytes": 295
}
],
"name": "social-url-import",
"skill_md_contents": "---\nname: social-url-import\ndescription: Import public social and video links into Speak AI and read the results. Use this when someone pastes a YouTube, TikTok, Instagram, X, Facebook, Reddit, SoundCloud, Twitch, Dailymotion, Streamable, Snapchat, Pinterest, Tumblr, Bilibili, VK, OK.ru or Rutube link and wants it transcribed, summarized, analyzed or compared, when they hand over a list of links to process together, or when a link import fails and you need to tell them why. Covers which tool to call, what to pass for mediaType, how the batch import paces itself, and which failures are worth retrying. Uses upload_and_analyze, upload_and_analyze_batch, get_media_status, get_transcript, get_media_insights and list_media.\nlicense: MIT\nmetadata:\n server-version: \"1.41.1\"\n categories: \"media\"\n---\n\n# Importing public social and video links\n\nThe user's explicit instructions take priority over this skill. When they ask for something different from the steps below, do what they asked, and confirm with them before any action that deletes, overwrites, or sends data outside Speak AI.\n\nSpeak AI resolves a shareable page link to the media behind it, server-side. You pass\nthe link as the user gave it. You never download the file, scrape the page, or hunt for\na direct file URL first.\n\n## Which tool\n\n| Situation | Tool |\n|---|---|\n| One link | `upload_and_analyze` |\n| Two or more links | `upload_and_analyze_batch` |\n| A file on the user's disk | `get_signed_upload_url`, PUT the bytes, then `upload_media` (`upload_local_file` on local stdio only) |\n| A direct file URL you already have | `upload_and_analyze` works for these too |\n\nNever call `upload_and_analyze` in a loop. `upload_and_analyze_batch` takes up to 25\nlinks, runs 5 at a time, and reports each one separately, so one dead link does not cost\nyou the other twenty four.\n\n## Supported links\n\nYouTube, TikTok, Instagram, X/Twitter, Facebook, Reddit, SoundCloud, Twitch, Dailymotion,\nStreamable, Snapchat, Pinterest, Tumblr, Bilibili, VK, OK.ru and Rutube.\n\n**Vimeo and Loom page links are not supported.** If a user pastes one, say so rather\nthan letting the import fail with a generic message.\n\nPost and video URLs only. A TikTok *profile* URL is expanded into a list of recent videos\nby the Speak AI web app, not by these tools, so ask the user for the specific videos.\n\n## What to pass\n\nOnly three things matter. Everything else is optional metadata.\n\n**`url`** — exactly as the user gave it. Do not strip tracking parameters, expand a short\nlink, or convert it to a file URL. The server handles all of that.\n\n**`mediaType`** — send it when the user has told you which they want:\n\n- They said \"audio\", \"just the audio\", \"podcast\", \"transcribe the audio\" → `\"audio\"`\n- They said \"video\", or want anything about what is on screen → `\"video\"`\n- They did not say → **omit it**\n\nOmitting is the important case. With no `mediaType` the server picks the best track the\nplatform offers, which is video where a video track exists. If you send `\"audio\"`, Speak\nAI imports the audio track only, and that is permanent: the stored file is audio, so the\nmedia can never be analysed as video later. Guessing \"audio\" to be safe is the one thing\nthat cannot be undone.\n\n**`folderId`** — pass it when the user named a destination, or when you are importing a\nbatch that belongs together. `list_folders` gets you the id, `create_folder` makes one.\n\nOptional: `sourceLanguage` (BCP-47, for example `en-US`), `tags`, and `name` on the\nsingle-link tool.\n\n## One link\n\n```\nupload_and_analyze(url: \"https://www.youtube.com/watch?v=…\")\n → { mediaId, state: \"pending\" }\n```\n\nThen poll `get_media_status(mediaId)` every 10 to 30 seconds. States run `queued`,\n`preparing`, `processing`, `preparingAnalysis`, `processed`, `failed`. Media under an\nhour usually finishes in 1 to 3 minutes; a long video takes longer because the source has\nto be fetched before transcription starts.\n\nOn `processed`, call `get_media_insights` for summaries, topics, sentiment and action\nitems, and `get_transcript` for the timestamped text.\n\n## Several links\n\n```\nupload_and_analyze_batch(\n urls: [\"https://…\", \"https://…\", \"https://…\"],\n folderId: \"…\" // optional, keeps them together\n)\n```\n\nThe response tells you exactly what happened:\n\n```json\n{\n \"requested\": 3,\n \"uploaded\": 2,\n \"failed\": 1,\n \"media\": [{ \"url\": \"…\", \"mediaId\": \"…\", \"state\": \"pending\" }],\n \"errors\": [{ \"url\": \"…\", \"error\": \"…\" }]\n}\n```\n\nRead `errors` and tell the user which links did not make it and why. Do not silently\nretry them and do not present a partial batch as a complete one.\n\n`concurrency` defaults to 5 and can be lowered to 1 when the user wants strict order.\nRaising it is not possible; the ceiling protects the upload API.\n\nDuplicate URLs in one call are imported once. Splitting a mixed audio-and-video batch into\ntwo calls is better than sending one `mediaType` that is wrong for half of them.\n\nOnce several are `processed`, read them together and answer the user's question across\nthe whole set yourself, which is usually what someone wants after handing you a list. Use\n`get_transcript` and `get_media_insights` on each one, or `list_media` with\n`include: [\"transcription\"]` to get the transcripts back in one call, and name the source\nlink for each point you make.\n\n## When an import fails\n\n- **\"Could not import this YouTube video\"** — the upstream provider refused this specific\n video. Copyright blocks, private and region-locked videos land here. Retrying rarely\n helps; a different video will work.\n- **\"YouTube imports are temporarily rate limited\"** — this one does clear. Wait and retry.\n- **\"This does not look like a valid YouTube link\"** — the URL is malformed. Ask for it again.\n- **A live stream** — cannot be imported until the stream has ended.\n- **Vimeo or Loom** — not supported on this path at all.\n\nA failure at upload time is reported to you immediately. A failure *after* upload shows up\nas `state: \"failed\"` from `get_media_status`, so a status poll that never reaches\n`processed` is worth surfacing rather than polling forever.\n\n## Cost and consent\n\nEvery import consumes the workspace's credits, and a batch multiplies that. When a user\npastes a long list, say how many links you are about to import before you run it. Imported\nmedia lands in their workspace permanently until deleted.\n"
}SHA-256 of public snapshot: 338803046417845ef421ebfe0cc435d837f4c8e099ab8a14aace8b11a25188cb