{
  "data": {
    "id": "DHJ6AF7rUGBo2bUjK",
    "actId": "BEU5z7tj6h8MNRtJO",
    "userId": "zq8lKbpLzTjGDayPC",
    "startedAt": "2026-11-05T17:58:31.566Z",
    "finishedAt": "2026-11-05T17:58:36.566Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 4929,
      "runTimeSecs": 4.929,
      "computeUnits": 0.005476666666666667,
      "imageSizeBytes": 319007744
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "createdByOrganizationMemberUserId": "GK9YjZRyQZVzOdoH5",
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"YouTube SponsorBlock Segments Scraper\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"videoUrls\": {\n      \"title\": \"Video URLs or IDs\",\n      \"type\": \"array\",\n      \"description\": \"YouTube video URLs or 11-character video IDs. Accepts watch, youtu.be, Shorts, live, embed, and music links. Add multiple videos for a batch.\",\n      \"editor\": \"stringList\",\n      \"prefill\": [\n        \"https://www.youtube.com/watch?v=7wtfhZwyrcc\"\n      ],\n      \"items\": {\n        \"type\": \"string\"\n      }\n    },\n    \"categories\": {\n      \"title\": \"Segment categories\",\n      \"type\": \"array\",\n      \"description\": \"Only return these SponsorBlock categories. Leave empty to include every category.\",\n      \"editor\": \"select\",\n      \"default\": [],\n      \"prefill\": [\n        \"sponsor\",\n        \"intro\"\n      ],\n      \"items\": {\n        \"type\": \"string\",\n        \"enum\": [\n          \"sponsor\",\n          \"selfpromo\",\n          \"interaction\",\n          \"intro\",\n          \"outro\",\n          \"preview\",\n          \"hook\",\n          \"music_offtopic\",\n          \"filler\",\n          \"poi_highlight\",\n          \"exclusive_access\",\n          \"chapter\"\n        ],\n        \"enumTitles\": [\n          \"Sponsor\",\n          \"Unpaid/Self Promotion\",\n          \"Interaction Reminder\",\n          \"Intro\",\n          \"Outro\",\n          \"Preview/Recap\",\n          \"Hook\",\n          \"Non-Music Section\",\n          \"Filler Tangent\",\n          \"Highlight\",\n          \"Exclusive Access\",\n          \"Chapter\"\n        ]\n      }\n    },\n    \"actionTypes\": {\n      \"title\": \"Action types\",\n      \"type\": \"array\",\n      \"description\": \"Only return segments whose action matches one of these. Leave empty to include every action.\",\n      \"editor\": \"select\",\n      \"default\": [],\n      \"items\": {\n        \"type\": \"string\",\n        \"enum\": [\n          \"skip\",\n          \"mute\",\n          \"full\",\n          \"poi\",\n          \"chapter\"\n        ],\n        \"enumTitles\": [\n          \"Skip\",\n          \"Mute\",\n          \"Full video\",\n          \"Highlight/POI\",\n          \"Chapter\"\n        ]\n      }\n    },\n    \"source\": {\n      \"title\": \"Segment source\",\n      \"type\": \"string\",\n      \"description\": \"Use 'Visible segments' for the segments SponsorBlock currently acts on. Use 'All submissions' to include hidden and disputed submissions from the search database.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"visible\",\n        \"all\"\n      ],\n      \"enumTitles\": [\n        \"Visible segments\",\n        \"All submissions (includes hidden)\"\n      ],\n      \"default\": \"visible\",\n      \"prefill\": \"visible\"\n    },\n    \"minVotes\": {\n      \"title\": \"Minimum votes\",\n      \"type\": \"integer\",\n      \"description\": \"Drop segments with fewer community votes than this. Use -2 to include every submission, 0 to drop downvoted ones, or a higher value to keep only well-confirmed segments.\",\n      \"default\": 0,\n      \"minimum\": -2,\n      \"maximum\": 1000000,\n      \"prefill\": 0\n    },\n    \"includeHiddenSegments\": {\n      \"title\": \"Include hidden submissions\",\n      \"type\": \"boolean\",\n      \"description\": \"When the source is 'All submissions', also return segments hidden by moderation or a shadowbanned submitter.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"includeDescriptions\": {\n      \"title\": \"Include segment descriptions\",\n      \"type\": \"boolean\",\n      \"description\": \"Include the community-written note attached to a segment when one exists.\",\n      \"default\": true,\n      \"prefill\": true\n    },\n    \"includeSubmitterInfo\": {\n      \"title\": \"Include public submitter info\",\n      \"type\": \"boolean\",\n      \"description\": \"Resolve each segment's public SponsorBlock submitter ID to a username and aggregate stats when available. Never exposes private IDs.\",\n      \"default\": true,\n      \"prefill\": true\n    },\n    \"includeYouTubeMetadata\": {\n      \"title\": \"Include YouTube metadata\",\n      \"type\": \"boolean\",\n      \"description\": \"Add the video title, channel name/URL/ID, thumbnail, YouTube duration, view count, publish date, and live status from YouTube's public oEmbed and player endpoints.\",\n      \"default\": true,\n      \"prefill\": true\n    },\n    \"includeSummary\": {\n      \"title\": \"Include summary rows\",\n      \"type\": \"boolean\",\n      \"description\": \"Add one per-video summary row (segment count, total seconds, category/action breakdown) and one run summary row.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"maxSegmentsPerVideo\": {\n      \"title\": \"Maximum segments per video\",\n      \"type\": \"integer\",\n      \"description\": \"Keep at most this many segments per video after filtering and sorting by start time. Use 0 for no limit.\",\n      \"default\": 0,\n      \"minimum\": 0,\n      \"maximum\": 1000000,\n      \"prefill\": 0\n    },\n    \"concurrency\": {\n      \"title\": \"Simultaneous videos\",\n      \"type\": \"integer\",\n      \"description\": \"How many videos to process at the same time. Higher is faster but can trigger rate limits.\",\n      \"default\": 4,\n      \"minimum\": 1,\n      \"maximum\": 10,\n      \"prefill\": 4\n    }\n  },\n  \"required\": [\n    \"videoUrls\"\n  ]\n}",
    "readme": "# YouTube SponsorBlock Segments Scraper\n\nExport crowdsourced SponsorBlock timestamps for any batch of YouTube videos. Every row is one segment: what it is, when it starts and ends, how the community voted, who submitted it when that is public, and the YouTube title, channel, and thumbnail that make the segment easy to join onto other datasets.\n\nNo YouTube login, SponsorBlock account, API key, browser, or proxy is needed. The actor reads the public SponsorBlock database and YouTube's public metadata endpoints.\n\n## Two ways to read the data\n\n- **Visible segments (default)** — exactly what SponsorBlock returns to its extension: the segments viewers are currently offered, with the video duration attached to each segment.\n- **All submissions** — the full search database, with views and submission time. Hidden, shadow-hidden, and disputed submissions are included only when **Include hidden submissions** is enabled. This mode is for research and moderation work, not for deciding what to skip.\n\nBoth modes accept the same category, action, vote, and per-video cap filters.\n\n## What you get\n\nOne dataset row per segment. Status rows explain videos with no matching segments, invalid inputs, or a failed lookup. Optional summary rows give per-video and whole-run totals.\n\n| Field | Example | Meaning |\n|---|---|---|\n| recordType | `segment` | `segment`, `status`, `videoSummary`, or `runSummary` |\n| videoId | `7wtfhZwyrcc` | 11-character YouTube ID |\n| videoUrl | `https://www.youtube.com/watch?v=7wtfhZwyrcc` | Canonical watch URL |\n| segmentId | `1561e818...` | SponsorBlock segment UUID |\n| category / categoryName | `sponsor` / `Sponsor` | Category key and readable label |\n| actionType / actionName | `skip` / `Skip` | Skip, mute, full video, highlight/POI, or chapter |\n| startTime / endTime | `0` / `31.861` | Seconds from the start of the video |\n| durationSeconds | `31.861` | Segment length in seconds |\n| videoDurationSeconds | `361` | Video duration reported by SponsorBlock or YouTube |\n| votes | `0` | Community vote score |\n| locked | `false` | Whether the segment is locked from edits |\n| views | `213` | Reported views on the submission (when available) |\n| timeSubmitted | `2021-06-07T01:55:42+00:00` | Submission time (when available) |\n| hidden / shadowHidden | `false` | Moderation or shadowban state (all-submissions mode) |\n| description | `Pre-Lyrics` | Community note, when one exists |\n| submitterId | `62fc5a8d...` | Public SponsorBlock submitter ID |\n| submitterName | `blabdude` | Public username, when the submitter set one |\n| submitterSegmentCount | `23402` | Public submitter segment count |\n| submitterReputation | `27` | Public submitter reputation score |\n| submitterMinutesSaved | `13669789.992` | Public minutes-saved total |\n| submitterViewCount | `41955231` | Public submitter view total |\n| submitterVip | `true` | Public VIP flag |\n| videoTitle | `Imagine Dragons - Believer...` | YouTube title from oEmbed/player |\n| channelName / channelId | `ImagineDragonsVEVO` / `UCpx_k...` | Channel name and ID |\n| channelUrl | `https://www.youtube.com/@ImagineDragonsVEVO` | Channel URL |\n| thumbnailUrl | `https://i.ytimg.com/...` | Public thumbnail |\n| youtubeDurationSeconds | `217` | Duration reported by YouTube |\n| videoViewCount | `3072396590` | YouTube view count |\n| publishedAt | `2017-03-07` | YouTube publish date |\n| isLive | `false` | Live-stream flag |\n| status | `no_segments` | Status rows only |\n| error | `...` | Status rows only |\n| scrapedAt | `2026-11-05T...` | Capture timestamp |\n\nEvery empty value is omitted at every depth. There are no null placeholders, empty strings, empty lists, or empty objects in the dataset.\n\n### Status rows\n\n| status | Meaning |\n|---|---|\n| `no_segments` | The lookup succeeded but no segment matched the category, action, vote, hidden, or cap filters. |\n| `invalid_video` | The input was not a YouTube video URL or ID. |\n| `failed` | SponsorBlock did not return a usable response after retries. |\n\n### Summary rows\n\nSet **Include summary rows** to add:\n\n- `videoSummary` per processed video: `segmentCount`, `totalSegmentSeconds`, `averageSegmentSeconds`, `longestSegmentSeconds`, category and action counts, and the YouTube metadata.\n- `runSummary` once per run: requested/processed/with-segments/without-segments/failed counts, total segment count and seconds, category and action totals.\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `videoUrls` | string array, required | — | YouTube URLs or 11-character IDs. Watch, `youtu.be`, Shorts, live, embed, music, and no-cookie links are accepted. Add as many as you need. |\n| `categories` | multi-select | all | Sponsor, Unpaid/Self Promotion, Interaction Reminder, Intro, Outro, Preview/Recap, Hook, Non-Music Section, Filler Tangent, Highlight, Exclusive Access, Chapter. |\n| `actionTypes` | multi-select | all | Skip, Mute, Full video, Highlight/POI, Chapter. |\n| `source` | select | `visible` | Visible segments or all submissions. |\n| `minVotes` | integer | `0` | `-2` includes every submission, `0` drops downvoted ones, higher values keep only well-confirmed segments. |\n| `includeHiddenSegments` | boolean | `false` | Include hidden/shadow-hidden submissions in all-submissions mode. |\n| `includeDescriptions` | boolean | `true` | Include community notes. |\n| `includeSubmitterInfo` | boolean | `true` | Add public submitter name and stats, cached per submitter. |\n| `includeYouTubeMetadata` | boolean | `true` | Add YouTube title, channel, thumbnail, duration, views, publish date, and live flag. |\n| `includeSummary` | boolean | `false` | Add per-video and run summary rows. |\n| `maxSegmentsPerVideo` | integer | `0` | Keep at most N segments per video after filtering and sorting. `0` means no limit. |\n| `concurrency` | integer | `4` | Videos processed at once, from 1 to 10. |\n\nLegacy input keys from older tasks are still honored in code: `videoIds`, `videoIDs`, `videos`, `urls`, `videoId`, `videoUrl`, `category`, `actionType`, `actions`, and `includeDescription`. A comma- or newline-separated `videoUrls` string also works. They are intentionally not shown in the input form.\n\n### Example: batch with filters\n\n```json\n{\n  \"videoUrls\": [\n    \"https://www.youtube.com/watch?v=9bZkp7q19f0\",\n    \"https://youtu.be/kJQP7kiw5Fk\",\n    \"dQw4w9WgXcQ\"\n  ],\n  \"categories\": [\"sponsor\", \"selfpromo\", \"intro\", \"outro\"],\n  \"actionTypes\": [\"skip\"],\n  \"minVotes\": 0,\n  \"includeYouTubeMetadata\": true,\n  \"includeSummary\": true,\n  \"maxSegmentsPerVideo\": 25,\n  \"concurrency\": 4\n}\n```\n\n### Example: full research mode\n\n```json\n{\n  \"videoUrls\": [\"kJQP7kiw5Fk\"],\n  \"source\": \"all\",\n  \"minVotes\": -2,\n  \"includeHiddenSegments\": true,\n  \"includeSubmitterInfo\": true,\n  \"includeYouTubeMetadata\": true\n}\n```\n\n## Use cases\n\n- **Player overlays and cut lists** — exact start/end times and the recommended action.\n- **Sponsor-load analytics** — sponsor seconds as a share of total runtime, by video or channel.\n- **Dataset enrichment** — stable segment UUIDs plus video/channel/thumbnail join keys.\n- **Transcript cleanup** — remove sponsor, intro, outro, and self-promo spans before analysis.\n- **Community research** — compare submissions, votes, lock state, and public submitter stats.\n\n## FAQ\n\n**What is SponsorBlock?**\n\nSponsorBlock is a public crowdsourced database of timestamped YouTube segments such as sponsor reads, intros, outros, and self-promotions.\n\n**Do I need cookies, an API key, or a proxy?**\n\nNo. Every request uses public endpoints. The actor never asks for credentials and never configures a proxy.\n\n**Why does one video return no rows?**\n\nSponsorBlock is crowdsourced. A video may have no submissions, or every submission may be filtered out by the selected categories, actions, votes, hidden setting, or per-video cap. A `no_segments` status row tells you which case occurred.\n\n**What is the difference between visible segments and all submissions?**\n\nVisible segments are what SponsorBlock would currently act on. All submissions also includes hidden, shadow-hidden, and disputed records, which is useful for research but should not be used to build a skip list.\n\n**Why do some rows have no thumbnail or title?**\n\nAge-restricted, private, or deleted videos can reject the public YouTube metadata endpoints. Segments are still returned; the unavailable metadata fields are simply omitted.\n\n**Why is `submitterName` sometimes missing?**\n\nSponsorBlock only exposes a public username when the submitter set one and the public lookup succeeds. Otherwise the row keeps the public `submitterId` and any aggregate stats that were available.\n\n**Why do some segments have zero duration or start and end at zero?**\n\n`full` and some `chapter`/`poi` submissions use a single point or the whole video. The actor preserves exactly what SponsorBlock stores and does not invent times.\n\n**Can I get the global SponsorBlock leaderboard?**\n\nNo. The public `getTopUsers` endpoint is disabled and returns 404. The actor does not expose a mode that cannot return real data.\n\n**Does this download videos, captions, or promo codes?**\n\nNo. It reads timestamps and public metadata only. Promo codes are not part of the SponsorBlock database and are out of scope.\n\n**Is this affiliated with YouTube or SponsorBlock?**\n\nNo. It is an independent reader of public APIs and is not endorsed by either project.\n\n## Limits\n\n- SponsorBlock coverage is community-driven and varies by video and channel.\n- Votes, views, hidden state, and lock state are a snapshot at fetch time.\n- `source=all` is a separate database view, not a moderation tool; it never submits, votes, or edits anything.\n- `getTopUsers` is disabled upstream, and `mute` submissions may be absent for a given video.\n- The actor keeps every existing output field and adds new ones; old tasks continue to work.\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "youtube-sponsorblock-segments-scraper",
      "title": "YouTube SponsorBlock Segments Scraper",
      "description": "Get community-reported SponsorBlock segments for any YouTube video: sponsor reads, intros, outros, self-promos, filler, highlights, and more, with exact times, votes, public submitter attribution, and YouTube metadata.",
      "version": "1.0",
      "buildTag": "latest",
      "dockerfile": "./Dockerfile",
      "readme": "# YouTube SponsorBlock Segments Scraper\n\nExport crowdsourced SponsorBlock timestamps for any batch of YouTube videos. Every row is one segment: what it is, when it starts and ends, how the community voted, who submitted it when that is public, and the YouTube title, channel, and thumbnail that make the segment easy to join onto other datasets.\n\nNo YouTube login, SponsorBlock account, API key, browser, or proxy is needed. The actor reads the public SponsorBlock database and YouTube's public metadata endpoints.\n\n## Two ways to read the data\n\n- **Visible segments (default)** — exactly what SponsorBlock returns to its extension: the segments viewers are currently offered, with the video duration attached to each segment.\n- **All submissions** — the full search database, with views and submission time. Hidden, shadow-hidden, and disputed submissions are included only when **Include hidden submissions** is enabled. This mode is for research and moderation work, not for deciding what to skip.\n\nBoth modes accept the same category, action, vote, and per-video cap filters.\n\n## What you get\n\nOne dataset row per segment. Status rows explain videos with no matching segments, invalid inputs, or a failed lookup. Optional summary rows give per-video and whole-run totals.\n\n| Field | Example | Meaning |\n|---|---|---|\n| recordType | `segment` | `segment`, `status`, `videoSummary`, or `runSummary` |\n| videoId | `7wtfhZwyrcc` | 11-character YouTube ID |\n| videoUrl | `https://www.youtube.com/watch?v=7wtfhZwyrcc` | Canonical watch URL |\n| segmentId | `1561e818...` | SponsorBlock segment UUID |\n| category / categoryName | `sponsor` / `Sponsor` | Category key and readable label |\n| actionType / actionName | `skip` / `Skip` | Skip, mute, full video, highlight/POI, or chapter |\n| startTime / endTime | `0` / `31.861` | Seconds from the start of the video |\n| durationSeconds | `31.861` | Segment length in seconds |\n| videoDurationSeconds | `361` | Video duration reported by SponsorBlock or YouTube |\n| votes | `0` | Community vote score |\n| locked | `false` | Whether the segment is locked from edits |\n| views | `213` | Reported views on the submission (when available) |\n| timeSubmitted | `2021-06-07T01:55:42+00:00` | Submission time (when available) |\n| hidden / shadowHidden | `false` | Moderation or shadowban state (all-submissions mode) |\n| description | `Pre-Lyrics` | Community note, when one exists |\n| submitterId | `62fc5a8d...` | Public SponsorBlock submitter ID |\n| submitterName | `blabdude` | Public username, when the submitter set one |\n| submitterSegmentCount | `23402` | Public submitter segment count |\n| submitterReputation | `27` | Public submitter reputation score |\n| submitterMinutesSaved | `13669789.992` | Public minutes-saved total |\n| submitterViewCount | `41955231` | Public submitter view total |\n| submitterVip | `true` | Public VIP flag |\n| videoTitle | `Imagine Dragons - Believer...` | YouTube title from oEmbed/player |\n| channelName / channelId | `ImagineDragonsVEVO` / `UCpx_k...` | Channel name and ID |\n| channelUrl | `https://www.youtube.com/@ImagineDragonsVEVO` | Channel URL |\n| thumbnailUrl | `https://i.ytimg.com/...` | Public thumbnail |\n| youtubeDurationSeconds | `217` | Duration reported by YouTube |\n| videoViewCount | `3072396590` | YouTube view count |\n| publishedAt | `2017-03-07` | YouTube publish date |\n| isLive | `false` | Live-stream flag |\n| status | `no_segments` | Status rows only |\n| error | `...` | Status rows only |\n| scrapedAt | `2026-11-05T...` | Capture timestamp |\n\nEvery empty value is omitted at every depth. There are no null placeholders, empty strings, empty lists, or empty objects in the dataset.\n\n### Status rows\n\n| status | Meaning |\n|---|---|\n| `no_segments` | The lookup succeeded but no segment matched the category, action, vote, hidden, or cap filters. |\n| `invalid_video` | The input was not a YouTube video URL or ID. |\n| `failed` | SponsorBlock did not return a usable response after retries. |\n\n### Summary rows\n\nSet **Include summary rows** to add:\n\n- `videoSummary` per processed video: `segmentCount`, `totalSegmentSeconds`, `averageSegmentSeconds`, `longestSegmentSeconds`, category and action counts, and the YouTube metadata.\n- `runSummary` once per run: requested/processed/with-segments/without-segments/failed counts, total segment count and seconds, category and action totals.\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `videoUrls` | string array, required | — | YouTube URLs or 11-character IDs. Watch, `youtu.be`, Shorts, live, embed, music, and no-cookie links are accepted. Add as many as you need. |\n| `categories` | multi-select | all | Sponsor, Unpaid/Self Promotion, Interaction Reminder, Intro, Outro, Preview/Recap, Hook, Non-Music Section, Filler Tangent, Highlight, Exclusive Access, Chapter. |\n| `actionTypes` | multi-select | all | Skip, Mute, Full video, Highlight/POI, Chapter. |\n| `source` | select | `visible` | Visible segments or all submissions. |\n| `minVotes` | integer | `0` | `-2` includes every submission, `0` drops downvoted ones, higher values keep only well-confirmed segments. |\n| `includeHiddenSegments` | boolean | `false` | Include hidden/shadow-hidden submissions in all-submissions mode. |\n| `includeDescriptions` | boolean | `true` | Include community notes. |\n| `includeSubmitterInfo` | boolean | `true` | Add public submitter name and stats, cached per submitter. |\n| `includeYouTubeMetadata` | boolean | `true` | Add YouTube title, channel, thumbnail, duration, views, publish date, and live flag. |\n| `includeSummary` | boolean | `false` | Add per-video and run summary rows. |\n| `maxSegmentsPerVideo` | integer | `0` | Keep at most N segments per video after filtering and sorting. `0` means no limit. |\n| `concurrency` | integer | `4` | Videos processed at once, from 1 to 10. |\n\nLegacy input keys from older tasks are still honored in code: `videoIds`, `videoIDs`, `videos`, `urls`, `videoId`, `videoUrl`, `category`, `actionType`, `actions`, and `includeDescription`. A comma- or newline-separated `videoUrls` string also works. They are intentionally not shown in the input form.\n\n### Example: batch with filters\n\n```json\n{\n  \"videoUrls\": [\n    \"https://www.youtube.com/watch?v=9bZkp7q19f0\",\n    \"https://youtu.be/kJQP7kiw5Fk\",\n    \"dQw4w9WgXcQ\"\n  ],\n  \"categories\": [\"sponsor\", \"selfpromo\", \"intro\", \"outro\"],\n  \"actionTypes\": [\"skip\"],\n  \"minVotes\": 0,\n  \"includeYouTubeMetadata\": true,\n  \"includeSummary\": true,\n  \"maxSegmentsPerVideo\": 25,\n  \"concurrency\": 4\n}\n```\n\n### Example: full research mode\n\n```json\n{\n  \"videoUrls\": [\"kJQP7kiw5Fk\"],\n  \"source\": \"all\",\n  \"minVotes\": -2,\n  \"includeHiddenSegments\": true,\n  \"includeSubmitterInfo\": true,\n  \"includeYouTubeMetadata\": true\n}\n```\n\n## Use cases\n\n- **Player overlays and cut lists** — exact start/end times and the recommended action.\n- **Sponsor-load analytics** — sponsor seconds as a share of total runtime, by video or channel.\n- **Dataset enrichment** — stable segment UUIDs plus video/channel/thumbnail join keys.\n- **Transcript cleanup** — remove sponsor, intro, outro, and self-promo spans before analysis.\n- **Community research** — compare submissions, votes, lock state, and public submitter stats.\n\n## FAQ\n\n**What is SponsorBlock?**\n\nSponsorBlock is a public crowdsourced database of timestamped YouTube segments such as sponsor reads, intros, outros, and self-promotions.\n\n**Do I need cookies, an API key, or a proxy?**\n\nNo. Every request uses public endpoints. The actor never asks for credentials and never configures a proxy.\n\n**Why does one video return no rows?**\n\nSponsorBlock is crowdsourced. A video may have no submissions, or every submission may be filtered out by the selected categories, actions, votes, hidden setting, or per-video cap. A `no_segments` status row tells you which case occurred.\n\n**What is the difference between visible segments and all submissions?**\n\nVisible segments are what SponsorBlock would currently act on. All submissions also includes hidden, shadow-hidden, and disputed records, which is useful for research but should not be used to build a skip list.\n\n**Why do some rows have no thumbnail or title?**\n\nAge-restricted, private, or deleted videos can reject the public YouTube metadata endpoints. Segments are still returned; the unavailable metadata fields are simply omitted.\n\n**Why is `submitterName` sometimes missing?**\n\nSponsorBlock only exposes a public username when the submitter set one and the public lookup succeeds. Otherwise the row keeps the public `submitterId` and any aggregate stats that were available.\n\n**Why do some segments have zero duration or start and end at zero?**\n\n`full` and some `chapter`/`poi` submissions use a single point or the whole video. The actor preserves exactly what SponsorBlock stores and does not invent times.\n\n**Can I get the global SponsorBlock leaderboard?**\n\nNo. The public `getTopUsers` endpoint is disabled and returns 404. The actor does not expose a mode that cannot return real data.\n\n**Does this download videos, captions, or promo codes?**\n\nNo. It reads timestamps and public metadata only. Promo codes are not part of the SponsorBlock database and are out of scope.\n\n**Is this affiliated with YouTube or SponsorBlock?**\n\nNo. It is an independent reader of public APIs and is not endorsed by either project.\n\n## Limits\n\n- SponsorBlock coverage is community-driven and varies by video and channel.\n- Votes, views, hidden state, and lock state are a snapshot at fetch time.\n- `source=all` is a separate database view, not a moderation tool; it never submits, votes, or edits anything.\n- `getTopUsers` is disabled upstream, and `mute` submissions may be absent for a given video.\n- The actor keeps every existing output field and adds new ones; old tasks continue to work.\n",
      "input": {
        "title": "YouTube SponsorBlock Segments Scraper",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "videoUrls": {
            "title": "Video URLs or IDs",
            "type": "array",
            "description": "YouTube video URLs or 11-character video IDs. Accepts watch, youtu.be, Shorts, live, embed, and music links. Add multiple videos for a batch.",
            "editor": "stringList",
            "prefill": [
              "https://www.youtube.com/watch?v=7wtfhZwyrcc"
            ],
            "items": {
              "type": "string"
            }
          },
          "categories": {
            "title": "Segment categories",
            "type": "array",
            "description": "Only return these SponsorBlock categories. Leave empty to include every category.",
            "editor": "select",
            "default": [],
            "prefill": [
              "sponsor",
              "intro"
            ],
            "items": {
              "type": "string",
              "enum": [
                "sponsor",
                "selfpromo",
                "interaction",
                "intro",
                "outro",
                "preview",
                "hook",
                "music_offtopic",
                "filler",
                "poi_highlight",
                "exclusive_access",
                "chapter"
              ],
              "enumTitles": [
                "Sponsor",
                "Unpaid/Self Promotion",
                "Interaction Reminder",
                "Intro",
                "Outro",
                "Preview/Recap",
                "Hook",
                "Non-Music Section",
                "Filler Tangent",
                "Highlight",
                "Exclusive Access",
                "Chapter"
              ]
            }
          },
          "actionTypes": {
            "title": "Action types",
            "type": "array",
            "description": "Only return segments whose action matches one of these. Leave empty to include every action.",
            "editor": "select",
            "default": [],
            "items": {
              "type": "string",
              "enum": [
                "skip",
                "mute",
                "full",
                "poi",
                "chapter"
              ],
              "enumTitles": [
                "Skip",
                "Mute",
                "Full video",
                "Highlight/POI",
                "Chapter"
              ]
            }
          },
          "source": {
            "title": "Segment source",
            "type": "string",
            "description": "Use 'Visible segments' for the segments SponsorBlock currently acts on. Use 'All submissions' to include hidden and disputed submissions from the search database.",
            "editor": "select",
            "enum": [
              "visible",
              "all"
            ],
            "enumTitles": [
              "Visible segments",
              "All submissions (includes hidden)"
            ],
            "default": "visible",
            "prefill": "visible"
          },
          "minVotes": {
            "title": "Minimum votes",
            "type": "integer",
            "description": "Drop segments with fewer community votes than this. Use -2 to include every submission, 0 to drop downvoted ones, or a higher value to keep only well-confirmed segments.",
            "default": 0,
            "minimum": -2,
            "maximum": 1000000,
            "prefill": 0
          },
          "includeHiddenSegments": {
            "title": "Include hidden submissions",
            "type": "boolean",
            "description": "When the source is 'All submissions', also return segments hidden by moderation or a shadowbanned submitter.",
            "default": false,
            "prefill": false
          },
          "includeDescriptions": {
            "title": "Include segment descriptions",
            "type": "boolean",
            "description": "Include the community-written note attached to a segment when one exists.",
            "default": true,
            "prefill": true
          },
          "includeSubmitterInfo": {
            "title": "Include public submitter info",
            "type": "boolean",
            "description": "Resolve each segment's public SponsorBlock submitter ID to a username and aggregate stats when available. Never exposes private IDs.",
            "default": true,
            "prefill": true
          },
          "includeYouTubeMetadata": {
            "title": "Include YouTube metadata",
            "type": "boolean",
            "description": "Add the video title, channel name/URL/ID, thumbnail, YouTube duration, view count, publish date, and live status from YouTube's public oEmbed and player endpoints.",
            "default": true,
            "prefill": true
          },
          "includeSummary": {
            "title": "Include summary rows",
            "type": "boolean",
            "description": "Add one per-video summary row (segment count, total seconds, category/action breakdown) and one run summary row.",
            "default": false,
            "prefill": false
          },
          "maxSegmentsPerVideo": {
            "title": "Maximum segments per video",
            "type": "integer",
            "description": "Keep at most this many segments per video after filtering and sorting by start time. Use 0 for no limit.",
            "default": 0,
            "minimum": 0,
            "maximum": 1000000,
            "prefill": 0
          },
          "concurrency": {
            "title": "Simultaneous videos",
            "type": "integer",
            "description": "How many videos to process at the same time. Higher is faster but can trigger rate limits.",
            "default": 4,
            "minimum": 1,
            "maximum": 10,
            "prefill": 4
          }
        },
        "required": [
          "videoUrls"
        ]
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "YouTube SponsorBlock Segments Scraper Output",
        "description": "SponsorBlock segment rows, per-video/run summaries, and truthful per-video status rows.",
        "properties": {
          "segments": {
            "type": "string",
            "title": "YouTube SponsorBlock Segments Scraper dataset",
            "description": "Dataset containing segment rows, optional summary rows, and per-video status rows.",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          }
        }
      },
      "defaultRunOptions": {
        "build": "latest",
        "timeoutSecs": 3600,
        "memoryMbytes": 1024
      },
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "views": {
            "overview": {
              "title": "SponsorBlock segments",
              "transformation": {
                "fields": [
                  "recordType",
                  "videoId",
                  "category",
                  "actionType",
                  "startTime",
                  "endTime",
                  "durationSeconds",
                  "votes",
                  "videoTitle",
                  "videoUrl"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "recordType": {
                    "label": "Type",
                    "format": "text"
                  },
                  "videoId": {
                    "label": "Video ID",
                    "format": "text"
                  },
                  "category": {
                    "label": "Category",
                    "format": "text"
                  },
                  "actionType": {
                    "label": "Action",
                    "format": "text"
                  },
                  "startTime": {
                    "label": "Start (s)",
                    "format": "number"
                  },
                  "endTime": {
                    "label": "End (s)",
                    "format": "number"
                  },
                  "durationSeconds": {
                    "label": "Duration (s)",
                    "format": "number"
                  },
                  "votes": {
                    "label": "Votes",
                    "format": "number"
                  },
                  "videoTitle": {
                    "label": "Video title",
                    "format": "text"
                  },
                  "videoUrl": {
                    "label": "Video URL",
                    "format": "link"
                  }
                }
              }
            },
            "detailed": {
              "title": "Detailed",
              "transformation": {
                "fields": [
                  "recordType",
                  "videoId",
                  "videoUrl",
                  "segmentId",
                  "category",
                  "categoryName",
                  "actionType",
                  "actionName",
                  "startTime",
                  "endTime",
                  "durationSeconds",
                  "videoDurationSeconds",
                  "votes",
                  "locked",
                  "views",
                  "timeSubmitted",
                  "hidden",
                  "shadowHidden",
                  "submitterId",
                  "submitterName",
                  "submitterSegmentCount",
                  "description",
                  "videoTitle",
                  "channelName",
                  "channelUrl",
                  "channelId",
                  "thumbnailUrl",
                  "youtubeDurationSeconds",
                  "videoViewCount",
                  "publishedAt",
                  "isLive",
                  "status",
                  "error",
                  "scrapedAt"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "recordType": {
                    "label": "Type",
                    "format": "text"
                  },
                  "videoId": {
                    "label": "Video ID",
                    "format": "text"
                  },
                  "videoUrl": {
                    "label": "Video URL",
                    "format": "link"
                  },
                  "segmentId": {
                    "label": "Segment ID",
                    "format": "text"
                  },
                  "category": {
                    "label": "Category",
                    "format": "text"
                  },
                  "categoryName": {
                    "label": "Category Name",
                    "format": "text"
                  },
                  "actionType": {
                    "label": "Action",
                    "format": "text"
                  },
                  "startTime": {
                    "label": "Start (s)",
                    "format": "number"
                  },
                  "endTime": {
                    "label": "End (s)",
                    "format": "number"
                  },
                  "durationSeconds": {
                    "label": "Duration (s)",
                    "format": "number"
                  },
                  "videoDurationSeconds": {
                    "label": "Video Duration (s)",
                    "format": "number"
                  },
                  "votes": {
                    "label": "Votes",
                    "format": "number"
                  },
                  "locked": {
                    "label": "Locked",
                    "format": "boolean"
                  },
                  "views": {
                    "label": "Views",
                    "format": "number"
                  },
                  "submitterName": {
                    "label": "Submitter",
                    "format": "text"
                  },
                  "videoTitle": {
                    "label": "Video title",
                    "format": "text"
                  },
                  "channelName": {
                    "label": "Channel",
                    "format": "text"
                  },
                  "thumbnailUrl": {
                    "label": "Thumbnail",
                    "format": "image"
                  },
                  "status": {
                    "label": "Status",
                    "format": "text"
                  },
                  "error": {
                    "label": "Error",
                    "format": "text"
                  },
                  "scrapedAt": {
                    "label": "Scraped At",
                    "format": "text"
                  }
                }
              }
            },
            "summaries": {
              "title": "Summaries",
              "transformation": {
                "fields": [
                  "recordType",
                  "videoId",
                  "videoTitle",
                  "channelName",
                  "source",
                  "segmentCount",
                  "totalSegmentSeconds",
                  "averageSegmentSeconds",
                  "longestSegmentSeconds",
                  "videoDurationSeconds",
                  "categories",
                  "actions",
                  "scrapedAt"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "recordType": {
                    "label": "Type",
                    "format": "text"
                  },
                  "videoId": {
                    "label": "Video ID",
                    "format": "text"
                  },
                  "videoTitle": {
                    "label": "Video title",
                    "format": "text"
                  },
                  "channelName": {
                    "label": "Channel",
                    "format": "text"
                  },
                  "source": {
                    "label": "Source",
                    "format": "text"
                  },
                  "segmentCount": {
                    "label": "Segments",
                    "format": "number"
                  },
                  "totalSegmentSeconds": {
                    "label": "Total seconds",
                    "format": "number"
                  },
                  "averageSegmentSeconds": {
                    "label": "Average seconds",
                    "format": "number"
                  },
                  "longestSegmentSeconds": {
                    "label": "Longest seconds",
                    "format": "number"
                  },
                  "videoDurationSeconds": {
                    "label": "Video duration (s)",
                    "format": "number"
                  },
                  "scrapedAt": {
                    "label": "Scraped At",
                    "format": "text"
                  }
                }
              }
            }
          }
        }
      }
    },
    "buildNumber": "1.0.2",
    "imageDigest": "64cb69ad7874cac1792aaaa29b4f0358dd1562b591ae1ee6ecf9bbb1732626e9",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "1.0"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.005476666666666667
    }
  }
}