{
  "data": {
    "id": "jVtydLgaRgAoNQmFS",
    "actId": "mSw6ELIsZXjgPdFNp",
    "userId": "zq8lKbpLzTjGDayPC",
    "startedAt": "2026-11-05T14:02:28.975Z",
    "finishedAt": "2026-11-05T14:02:34.088Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 5044,
      "runTimeSecs": 5.044,
      "computeUnits": 0.005604444444444444,
      "imageSizeBytes": 319069696
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "createdByOrganizationMemberUserId": "GK9YjZRyQZVzOdoH5",
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"YouTube Hashtag Scraper Input\",\n  \"description\": \"Scrape YouTube videos and Shorts by hashtag. Provide one or more hashtags to extract ranked videos, channel details, exact engagement counts, publish dates and more.\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"hashtags\": {\n      \"title\": \"Hashtags\",\n      \"type\": \"array\",\n      \"description\": \"Hashtags to scrape. Accepts a bare tag, a #tag, or a full youtube.com/hashtag/<tag> URL. Up to 200 unique tags per run.\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"minItems\": 1,\n      \"prefill\": [\n        \"programming\"\n      ]\n    },\n    \"maxResultsPerHashtag\": {\n      \"title\": \"Max Results Per Hashtag\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum records to return per hashtag after sorting and filters. YouTube's hashtag feed is a ranked sample, so large values may return fewer rows.\",\n      \"default\": 50,\n      \"prefill\": 2,\n      \"minimum\": 1,\n      \"maximum\": 500\n    },\n    \"contentType\": {\n      \"title\": \"Content Type\",\n      \"type\": \"string\",\n      \"description\": \"Which cards to return: regular videos, Shorts, or both.\",\n      \"editor\": \"select\",\n      \"default\": \"all\",\n      \"prefill\": \"videos\",\n      \"enum\": [\n        \"all\",\n        \"videos\",\n        \"shorts\"\n      ],\n      \"enumTitles\": [\n        \"All content\",\n        \"Regular videos only\",\n        \"Shorts only\"\n      ]\n    },\n    \"market\": {\n      \"title\": \"Market / Region\",\n      \"type\": \"string\",\n      \"description\": \"Country/region used for the hashtag feed. It changes which videos rank and the default language.\",\n      \"editor\": \"select\",\n      \"default\": \"US\",\n      \"prefill\": \"US\",\n      \"enum\": [\n        \"US\",\n        \"GB\",\n        \"CA\",\n        \"AU\",\n        \"DE\",\n        \"FR\",\n        \"JP\",\n        \"KR\",\n        \"BR\",\n        \"IN\",\n        \"MX\",\n        \"IT\",\n        \"ES\",\n        \"NL\",\n        \"PL\",\n        \"RU\",\n        \"SE\",\n        \"NO\",\n        \"DK\",\n        \"FI\",\n        \"ZA\",\n        \"SG\",\n        \"HK\",\n        \"TW\",\n        \"ID\",\n        \"MY\",\n        \"TH\",\n        \"PH\",\n        \"AR\",\n        \"CO\",\n        \"CL\"\n      ],\n      \"enumTitles\": [\n        \"United States\",\n        \"United Kingdom\",\n        \"Canada\",\n        \"Australia\",\n        \"Germany\",\n        \"France\",\n        \"Japan\",\n        \"South Korea\",\n        \"Brazil\",\n        \"India\",\n        \"Mexico\",\n        \"Italy\",\n        \"Spain\",\n        \"Netherlands\",\n        \"Poland\",\n        \"Russia\",\n        \"Sweden\",\n        \"Norway\",\n        \"Denmark\",\n        \"Finland\",\n        \"South Africa\",\n        \"Singapore\",\n        \"Hong Kong\",\n        \"Taiwan\",\n        \"Indonesia\",\n        \"Malaysia\",\n        \"Thailand\",\n        \"Philippines\",\n        \"Argentina\",\n        \"Colombia\",\n        \"Chile\"\n      ]\n    },\n    \"language\": {\n      \"title\": \"Language\",\n      \"type\": \"string\",\n      \"description\": \"Language used for YouTube labels, counts and dates. Auto follows the selected market.\",\n      \"editor\": \"select\",\n      \"default\": \"auto\",\n      \"prefill\": \"auto\",\n      \"enum\": [\n        \"auto\",\n        \"en\",\n        \"de\",\n        \"fr\",\n        \"ja\",\n        \"ko\",\n        \"pt\",\n        \"hi\",\n        \"es\",\n        \"it\",\n        \"nl\",\n        \"pl\",\n        \"ru\",\n        \"sv\",\n        \"no\",\n        \"da\",\n        \"fi\",\n        \"zh-Hant\",\n        \"id\",\n        \"ms\",\n        \"th\",\n        \"ar\",\n        \"tr\",\n        \"vi\",\n        \"uk\",\n        \"cs\",\n        \"ro\",\n        \"hu\",\n        \"el\",\n        \"he\"\n      ],\n      \"enumTitles\": [\n        \"Auto (match market)\",\n        \"English\",\n        \"German\",\n        \"French\",\n        \"Japanese\",\n        \"Korean\",\n        \"Portuguese\",\n        \"Hindi\",\n        \"Spanish\",\n        \"Italian\",\n        \"Dutch\",\n        \"Polish\",\n        \"Russian\",\n        \"Swedish\",\n        \"Norwegian\",\n        \"Danish\",\n        \"Finnish\",\n        \"Traditional Chinese\",\n        \"Indonesian\",\n        \"Malay\",\n        \"Thai\",\n        \"Arabic\",\n        \"Turkish\",\n        \"Vietnamese\",\n        \"Ukrainian\",\n        \"Czech\",\n        \"Romanian\",\n        \"Hungarian\",\n        \"Greek\",\n        \"Hebrew\"\n      ]\n    },\n    \"includeVideoDetails\": {\n      \"title\": \"Include Video Details\",\n      \"type\": \"boolean\",\n      \"description\": \"Fetch each video's detail data to fill exact views, likes, comments, subscriber counts, publish date, description, keywords, category and Shorts channel metadata. Slower but more complete.\",\n      \"default\": true,\n      \"prefill\": false\n    },\n    \"sortBy\": {\n      \"title\": \"Sort By\",\n      \"type\": \"string\",\n      \"description\": \"Order the collected results within each hashtag. Default keeps YouTube's first-seen feed order.\",\n      \"editor\": \"select\",\n      \"default\": \"default\",\n      \"prefill\": \"default\",\n      \"enum\": [\n        \"default\",\n        \"viewCount\",\n        \"durationSeconds\",\n        \"publishedAt\"\n      ],\n      \"enumTitles\": [\n        \"Feed order\",\n        \"Most views\",\n        \"Longest duration\",\n        \"Newest first\"\n      ]\n    },\n    \"minViewCount\": {\n      \"title\": \"Minimum View Count\",\n      \"type\": \"integer\",\n      \"description\": \"Drop videos with fewer than this many views. Turns on detail enrichment so compact Shorts labels are not mis-filtered.\",\n      \"minimum\": 0,\n      \"maximum\": 2000000000\n    },\n    \"publishedAfter\": {\n      \"title\": \"Published After\",\n      \"type\": \"string\",\n      \"description\": \"Only keep videos published on or after this date (YYYY-MM-DD). Turns on detail enrichment.\",\n      \"editor\": \"textfield\"\n    }\n  },\n  \"required\": [\n    \"hashtags\"\n  ]\n}",
    "readme": "# YouTube Hashtag Video & Shorts Ranking Scraper\n\nYouTube's hashtag pages are live rankings of the videos and Shorts carrying a tag. This actor reads that feed for any hashtag, pages as deep as YouTube allows, and returns each card with its channel, engagement, publish date and hashtag totals — with no login, cookies, API key or proxy setup.\n\n## What this actor does\n\n- **Reads one or many hashtags** in a single run, from bare tags, `#tags` or full YouTube hashtag URLs\n- **Pages the whole reachable feed** instead of stopping at the first screen, and handles both regular videos and Shorts\n- **Adds detail data on request** — exact views, likes, comments, subscriber counts, ISO publish dates, descriptions, keywords, categories, channel handles and avatars\n- **Sorts and filters locally** by views, duration, publish date, minimum views or earliest publish date\n- **Localizes correctly** with a market and language pair, including localized tab names and count formats\n- **Empty fields are omitted** — each record contains only the values YouTube actually supplied\n\n## Output per video or Short\n\n| Field | Description |\n|---|---|\n| `recordType` | `video` for content rows, `error` for a hashtag-level failure |\n| `success` | `false` on error rows, omitted on content rows |\n| `type` | `video` or `short` |\n| `hashtag` | Normalized hashtag, without `#` |\n| `hashtagUrl` | Canonical hashtag page URL |\n| `hashtagTitle` | The hashtag page's own display title |\n| `videoCountText` / `videoCount` | Total videos tagged with the hashtag, as displayed and as an exact number when YouTube shows one |\n| `channelCountText` / `channelCount` | Total channels posting under the hashtag, as displayed and as an exact number when available |\n| `position` | 1-indexed position in the returned, deduplicated result set |\n| `videoId` | YouTube video ID |\n| `title` | Video or Short title |\n| `url` | Watch URL for videos, Shorts URL for Shorts |\n| `channelName` | Channel display name |\n| `channelId` | YouTube channel ID |\n| `channelUrl` | Channel page URL |\n| `channelHandle` | Channel handle such as `@creator`, when YouTube exposes it |\n| `channelAvatarUrl` | Channel avatar image URL |\n| `channelSubscriberCountText` | Subscriber label as displayed, e.g. `1.2M subscribers` |\n| `channelSubscriberCount` | Exact subscriber count only when the label is not rounded |\n| `viewCountText` | Views as displayed, in the selected language |\n| `viewCount` | Exact view count when available; rounded labels stay text-only |\n| `likeCountText` | Likes as displayed, e.g. `11K` |\n| `likeCount` | Exact like count only when the label is not rounded |\n| `commentCountText` / `commentCount` | Comment count as displayed, and as an exact number when available |\n| `publishedTimeText` | Relative publish label, e.g. `3 days ago` |\n| `publishedAt` | ISO 8601 publish date; includes the time and source offset when YouTube exposes them |\n| `durationText` | Duration label such as `12:34` |\n| `durationSeconds` | Duration in seconds, including Shorts when details are on |\n| `thumbnailUrl` | Highest-resolution thumbnail available |\n| `isShort` | `true` for a Short, `false` for a regular video |\n| `description` | Video description |\n| `keywords` | Video keywords/tags array |\n| `category` | YouTube category name |\n| `badges` | Content badges such as `CC` or `4K` |\n| `scrapedAt` | ISO 8601 UTC timestamp of the run |\n| `errorCode` / `error` | Present on error rows: `INVALID_HASHTAG`, `HASHTAG_NOT_FOUND`, `NO_VIDEOS` or `BLOCKED` |\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `hashtags` | array | – | Tags to scrape, with or without `#`, or full hashtag URLs (required) |\n| `maxResultsPerHashtag` | integer | `50` | Records to return per hashtag after sorting and filters (1–500) |\n| `contentType` | string | `all` | `all`, `videos` (regular only) or `shorts` (Shorts only) |\n| `market` | string | `US` | Country/region for the feed |\n| `language` | string | `auto` | Label language; `auto` follows the market |\n| `includeVideoDetails` | boolean | `true` | Add exact counts, dates, descriptions and channel metadata |\n| `sortBy` | string | `default` | `default`, `viewCount`, `durationSeconds` or `publishedAt` |\n| `minViewCount` | integer | – | Drop videos below this exact view count |\n| `publishedAfter` | string | – | Keep only videos published on or after this date (`YYYY-MM-DD`) |\n\n### Example: one hashtag, ranked by views\n\n```json\n{\n  \"hashtags\": [\"#webscraping\"],\n  \"contentType\": \"all\",\n  \"maxResultsPerHashtag\": 100,\n  \"sortBy\": \"viewCount\",\n  \"includeVideoDetails\": true\n}\n```\n\n### Example: regular videos in Germany\n\n```json\n{\n  \"hashtags\": [\"cooking\"],\n  \"contentType\": \"videos\",\n  \"market\": \"DE\",\n  \"language\": \"de\",\n  \"maxResultsPerHashtag\": 50\n}\n```\n\n### Example: recent Shorts with a view floor\n\n```json\n{\n  \"hashtags\": [\"travel\", \"food\"],\n  \"contentType\": \"shorts\",\n  \"minViewCount\": 100000,\n  \"publishedAfter\": \"2026-01-01\",\n  \"sortBy\": \"publishedAt\",\n  \"maxResultsPerHashtag\": 100\n}\n```\n\n### Example: paste a hashtag URL\n\n```json\n{\n  \"hashtags\": [\"https://www.youtube.com/hashtag/artificialintelligence\"],\n  \"contentType\": \"videos\",\n  \"market\": \"JP\",\n  \"language\": \"ja\",\n  \"maxResultsPerHashtag\": 75\n}\n```\n\n## Use cases\n\n- **Trend discovery** — see which videos and Shorts currently rank under a topic, in a chosen market\n- **Creator sourcing** — find channels that repeatedly appear under a niche hashtag\n- **Campaign tracking** — monitor a branded hashtag's ranking and engagement over time\n- **Format research** — compare regular videos with Shorts using exact views, likes, comments and duration\n- **Regional analysis** — compare the same hashtag across markets and languages\n\n## FAQ\n\n**Do I need a YouTube account, API key or cookies?**\nNo. Hashtag pages and the detail data are public and the actor reads them anonymously.\n\n**Why are some fields missing from Shorts?**\nShorts cards carry less metadata than regular video cards. With `includeVideoDetails` on, channel, exact views, publish date and duration are filled from each Short's detail data. Rounded labels such as `1.2M views` remain text-only and are never presented as exact numbers.\n\n**How many results can I get per hashtag?**\nUp to `maxResultsPerHashtag`, but YouTube's hashtag feed is a ranked sample rather than a complete index. Large tags typically expose a few hundred unique cards over many pages; small or new tags may expose only a handful.\n\n**Why does the same input return a different order on another run?**\nYouTube shuffles hashtag feeds between requests. The actor deduplicates by video ID and assigns `position` from the returned set; use `sortBy` when you need a stable order.\n\n**What does `market` change?**\nIt changes which videos rank and the default language. `language` controls only labels and formatting; set it explicitly if you want a different language from the market default.\n\n**What is the difference between `viewCountText` and `viewCount`?**\n`viewCountText` is exactly what YouTube displayed. `viewCount` is an integer only when the source gives an unabridged number; compact labels remain text-only, so an estimate is never passed off as exact.\n\n**What happens if a hashtag has no results?**\nThe run continues to the next hashtag and writes an error row with `recordType: \"error\"`, an `errorCode` and a readable message.\n\n**Can I scrape more than one hashtag at once?**\nYes. List up to 200 unique hashtags; results are combined in one dataset with per-hashtag positions.\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "youtube-hashtag-video-and-shorts-ranking-scraper",
      "title": "YouTube Hashtag Video & Shorts Ranking Scraper",
      "description": "Rank videos and Shorts under any YouTube hashtag. Page the full reachable feed, filter and sort, and add exact views, likes, comments, subscriber counts, publish dates, descriptions and channel details.",
      "version": "1.0",
      "buildTag": "latest",
      "input": {
        "title": "YouTube Hashtag Scraper Input",
        "description": "Scrape YouTube videos and Shorts by hashtag. Provide one or more hashtags to extract ranked videos, channel details, exact engagement counts, publish dates and more.",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "hashtags": {
            "title": "Hashtags",
            "type": "array",
            "description": "Hashtags to scrape. Accepts a bare tag, a #tag, or a full youtube.com/hashtag/<tag> URL. Up to 200 unique tags per run.",
            "editor": "stringList",
            "items": {
              "type": "string"
            },
            "minItems": 1,
            "prefill": [
              "programming"
            ]
          },
          "maxResultsPerHashtag": {
            "title": "Max Results Per Hashtag",
            "type": "integer",
            "description": "Maximum records to return per hashtag after sorting and filters. YouTube's hashtag feed is a ranked sample, so large values may return fewer rows.",
            "default": 50,
            "prefill": 2,
            "minimum": 1,
            "maximum": 500
          },
          "contentType": {
            "title": "Content Type",
            "type": "string",
            "description": "Which cards to return: regular videos, Shorts, or both.",
            "editor": "select",
            "default": "all",
            "prefill": "videos",
            "enum": [
              "all",
              "videos",
              "shorts"
            ],
            "enumTitles": [
              "All content",
              "Regular videos only",
              "Shorts only"
            ]
          },
          "market": {
            "title": "Market / Region",
            "type": "string",
            "description": "Country/region used for the hashtag feed. It changes which videos rank and the default language.",
            "editor": "select",
            "default": "US",
            "prefill": "US",
            "enum": [
              "US",
              "GB",
              "CA",
              "AU",
              "DE",
              "FR",
              "JP",
              "KR",
              "BR",
              "IN",
              "MX",
              "IT",
              "ES",
              "NL",
              "PL",
              "RU",
              "SE",
              "NO",
              "DK",
              "FI",
              "ZA",
              "SG",
              "HK",
              "TW",
              "ID",
              "MY",
              "TH",
              "PH",
              "AR",
              "CO",
              "CL"
            ],
            "enumTitles": [
              "United States",
              "United Kingdom",
              "Canada",
              "Australia",
              "Germany",
              "France",
              "Japan",
              "South Korea",
              "Brazil",
              "India",
              "Mexico",
              "Italy",
              "Spain",
              "Netherlands",
              "Poland",
              "Russia",
              "Sweden",
              "Norway",
              "Denmark",
              "Finland",
              "South Africa",
              "Singapore",
              "Hong Kong",
              "Taiwan",
              "Indonesia",
              "Malaysia",
              "Thailand",
              "Philippines",
              "Argentina",
              "Colombia",
              "Chile"
            ]
          },
          "language": {
            "title": "Language",
            "type": "string",
            "description": "Language used for YouTube labels, counts and dates. Auto follows the selected market.",
            "editor": "select",
            "default": "auto",
            "prefill": "auto",
            "enum": [
              "auto",
              "en",
              "de",
              "fr",
              "ja",
              "ko",
              "pt",
              "hi",
              "es",
              "it",
              "nl",
              "pl",
              "ru",
              "sv",
              "no",
              "da",
              "fi",
              "zh-Hant",
              "id",
              "ms",
              "th",
              "ar",
              "tr",
              "vi",
              "uk",
              "cs",
              "ro",
              "hu",
              "el",
              "he"
            ],
            "enumTitles": [
              "Auto (match market)",
              "English",
              "German",
              "French",
              "Japanese",
              "Korean",
              "Portuguese",
              "Hindi",
              "Spanish",
              "Italian",
              "Dutch",
              "Polish",
              "Russian",
              "Swedish",
              "Norwegian",
              "Danish",
              "Finnish",
              "Traditional Chinese",
              "Indonesian",
              "Malay",
              "Thai",
              "Arabic",
              "Turkish",
              "Vietnamese",
              "Ukrainian",
              "Czech",
              "Romanian",
              "Hungarian",
              "Greek",
              "Hebrew"
            ]
          },
          "includeVideoDetails": {
            "title": "Include Video Details",
            "type": "boolean",
            "description": "Fetch each video's detail data to fill exact views, likes, comments, subscriber counts, publish date, description, keywords, category and Shorts channel metadata. Slower but more complete.",
            "default": true,
            "prefill": false
          },
          "sortBy": {
            "title": "Sort By",
            "type": "string",
            "description": "Order the collected results within each hashtag. Default keeps YouTube's first-seen feed order.",
            "editor": "select",
            "default": "default",
            "prefill": "default",
            "enum": [
              "default",
              "viewCount",
              "durationSeconds",
              "publishedAt"
            ],
            "enumTitles": [
              "Feed order",
              "Most views",
              "Longest duration",
              "Newest first"
            ]
          },
          "minViewCount": {
            "title": "Minimum View Count",
            "type": "integer",
            "description": "Drop videos with fewer than this many views. Turns on detail enrichment so compact Shorts labels are not mis-filtered.",
            "minimum": 0,
            "maximum": 2000000000
          },
          "publishedAfter": {
            "title": "Published After",
            "type": "string",
            "description": "Only keep videos published on or after this date (YYYY-MM-DD). Turns on detail enrichment.",
            "editor": "textfield"
          }
        },
        "required": [
          "hashtags"
        ]
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "YouTube Hashtag Video & Shorts Ranking Scraper Output",
        "description": "Videos and Shorts ranked under the requested hashtags, with view count, channel info and hashtag totals.",
        "properties": {
          "videos": {
            "type": "string",
            "title": "YouTube hashtag videos and Shorts",
            "description": "Dataset containing all scraped videos and shorts tagged with the requested hashtags.",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          }
        }
      },
      "dockerfile": "../Dockerfile",
      "readme": "# YouTube Hashtag Video & Shorts Ranking Scraper\n\nYouTube's hashtag pages are live rankings of the videos and Shorts carrying a tag. This actor reads that feed for any hashtag, pages as deep as YouTube allows, and returns each card with its channel, engagement, publish date and hashtag totals — with no login, cookies, API key or proxy setup.\n\n## What this actor does\n\n- **Reads one or many hashtags** in a single run, from bare tags, `#tags` or full YouTube hashtag URLs\n- **Pages the whole reachable feed** instead of stopping at the first screen, and handles both regular videos and Shorts\n- **Adds detail data on request** — exact views, likes, comments, subscriber counts, ISO publish dates, descriptions, keywords, categories, channel handles and avatars\n- **Sorts and filters locally** by views, duration, publish date, minimum views or earliest publish date\n- **Localizes correctly** with a market and language pair, including localized tab names and count formats\n- **Empty fields are omitted** — each record contains only the values YouTube actually supplied\n\n## Output per video or Short\n\n| Field | Description |\n|---|---|\n| `recordType` | `video` for content rows, `error` for a hashtag-level failure |\n| `success` | `false` on error rows, omitted on content rows |\n| `type` | `video` or `short` |\n| `hashtag` | Normalized hashtag, without `#` |\n| `hashtagUrl` | Canonical hashtag page URL |\n| `hashtagTitle` | The hashtag page's own display title |\n| `videoCountText` / `videoCount` | Total videos tagged with the hashtag, as displayed and as an exact number when YouTube shows one |\n| `channelCountText` / `channelCount` | Total channels posting under the hashtag, as displayed and as an exact number when available |\n| `position` | 1-indexed position in the returned, deduplicated result set |\n| `videoId` | YouTube video ID |\n| `title` | Video or Short title |\n| `url` | Watch URL for videos, Shorts URL for Shorts |\n| `channelName` | Channel display name |\n| `channelId` | YouTube channel ID |\n| `channelUrl` | Channel page URL |\n| `channelHandle` | Channel handle such as `@creator`, when YouTube exposes it |\n| `channelAvatarUrl` | Channel avatar image URL |\n| `channelSubscriberCountText` | Subscriber label as displayed, e.g. `1.2M subscribers` |\n| `channelSubscriberCount` | Exact subscriber count only when the label is not rounded |\n| `viewCountText` | Views as displayed, in the selected language |\n| `viewCount` | Exact view count when available; rounded labels stay text-only |\n| `likeCountText` | Likes as displayed, e.g. `11K` |\n| `likeCount` | Exact like count only when the label is not rounded |\n| `commentCountText` / `commentCount` | Comment count as displayed, and as an exact number when available |\n| `publishedTimeText` | Relative publish label, e.g. `3 days ago` |\n| `publishedAt` | ISO 8601 publish date; includes the time and source offset when YouTube exposes them |\n| `durationText` | Duration label such as `12:34` |\n| `durationSeconds` | Duration in seconds, including Shorts when details are on |\n| `thumbnailUrl` | Highest-resolution thumbnail available |\n| `isShort` | `true` for a Short, `false` for a regular video |\n| `description` | Video description |\n| `keywords` | Video keywords/tags array |\n| `category` | YouTube category name |\n| `badges` | Content badges such as `CC` or `4K` |\n| `scrapedAt` | ISO 8601 UTC timestamp of the run |\n| `errorCode` / `error` | Present on error rows: `INVALID_HASHTAG`, `HASHTAG_NOT_FOUND`, `NO_VIDEOS` or `BLOCKED` |\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `hashtags` | array | – | Tags to scrape, with or without `#`, or full hashtag URLs (required) |\n| `maxResultsPerHashtag` | integer | `50` | Records to return per hashtag after sorting and filters (1–500) |\n| `contentType` | string | `all` | `all`, `videos` (regular only) or `shorts` (Shorts only) |\n| `market` | string | `US` | Country/region for the feed |\n| `language` | string | `auto` | Label language; `auto` follows the market |\n| `includeVideoDetails` | boolean | `true` | Add exact counts, dates, descriptions and channel metadata |\n| `sortBy` | string | `default` | `default`, `viewCount`, `durationSeconds` or `publishedAt` |\n| `minViewCount` | integer | – | Drop videos below this exact view count |\n| `publishedAfter` | string | – | Keep only videos published on or after this date (`YYYY-MM-DD`) |\n\n### Example: one hashtag, ranked by views\n\n```json\n{\n  \"hashtags\": [\"#webscraping\"],\n  \"contentType\": \"all\",\n  \"maxResultsPerHashtag\": 100,\n  \"sortBy\": \"viewCount\",\n  \"includeVideoDetails\": true\n}\n```\n\n### Example: regular videos in Germany\n\n```json\n{\n  \"hashtags\": [\"cooking\"],\n  \"contentType\": \"videos\",\n  \"market\": \"DE\",\n  \"language\": \"de\",\n  \"maxResultsPerHashtag\": 50\n}\n```\n\n### Example: recent Shorts with a view floor\n\n```json\n{\n  \"hashtags\": [\"travel\", \"food\"],\n  \"contentType\": \"shorts\",\n  \"minViewCount\": 100000,\n  \"publishedAfter\": \"2026-01-01\",\n  \"sortBy\": \"publishedAt\",\n  \"maxResultsPerHashtag\": 100\n}\n```\n\n### Example: paste a hashtag URL\n\n```json\n{\n  \"hashtags\": [\"https://www.youtube.com/hashtag/artificialintelligence\"],\n  \"contentType\": \"videos\",\n  \"market\": \"JP\",\n  \"language\": \"ja\",\n  \"maxResultsPerHashtag\": 75\n}\n```\n\n## Use cases\n\n- **Trend discovery** — see which videos and Shorts currently rank under a topic, in a chosen market\n- **Creator sourcing** — find channels that repeatedly appear under a niche hashtag\n- **Campaign tracking** — monitor a branded hashtag's ranking and engagement over time\n- **Format research** — compare regular videos with Shorts using exact views, likes, comments and duration\n- **Regional analysis** — compare the same hashtag across markets and languages\n\n## FAQ\n\n**Do I need a YouTube account, API key or cookies?**\nNo. Hashtag pages and the detail data are public and the actor reads them anonymously.\n\n**Why are some fields missing from Shorts?**\nShorts cards carry less metadata than regular video cards. With `includeVideoDetails` on, channel, exact views, publish date and duration are filled from each Short's detail data. Rounded labels such as `1.2M views` remain text-only and are never presented as exact numbers.\n\n**How many results can I get per hashtag?**\nUp to `maxResultsPerHashtag`, but YouTube's hashtag feed is a ranked sample rather than a complete index. Large tags typically expose a few hundred unique cards over many pages; small or new tags may expose only a handful.\n\n**Why does the same input return a different order on another run?**\nYouTube shuffles hashtag feeds between requests. The actor deduplicates by video ID and assigns `position` from the returned set; use `sortBy` when you need a stable order.\n\n**What does `market` change?**\nIt changes which videos rank and the default language. `language` controls only labels and formatting; set it explicitly if you want a different language from the market default.\n\n**What is the difference between `viewCountText` and `viewCount`?**\n`viewCountText` is exactly what YouTube displayed. `viewCount` is an integer only when the source gives an unabridged number; compact labels remain text-only, so an estimate is never passed off as exact.\n\n**What happens if a hashtag has no results?**\nThe run continues to the next hashtag and writes an error row with `recordType: \"error\"`, an `errorCode` and a readable message.\n\n**Can I scrape more than one hashtag at once?**\nYes. List up to 200 unique hashtags; results are combined in one dataset with per-hashtag positions.\n",
      "defaultRunOptions": {
        "build": "latest",
        "timeoutSecs": 300,
        "memoryMbytes": 1024
      },
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "views": {
            "overview": {
              "title": "Hashtag Overview",
              "transformation": {
                "fields": [
                  "hashtag",
                  "position",
                  "type",
                  "videoId",
                  "title",
                  "url",
                  "channelName",
                  "viewCount",
                  "publishedAt"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "hashtag": {
                    "label": "Hashtag",
                    "format": "text"
                  },
                  "position": {
                    "label": "Position",
                    "format": "number"
                  },
                  "type": {
                    "label": "Type",
                    "format": "text"
                  },
                  "videoId": {
                    "label": "Video ID",
                    "format": "text"
                  },
                  "title": {
                    "label": "Title",
                    "format": "text"
                  },
                  "url": {
                    "label": "URL",
                    "format": "link"
                  },
                  "channelName": {
                    "label": "Channel",
                    "format": "text"
                  },
                  "viewCount": {
                    "label": "Views",
                    "format": "number"
                  },
                  "publishedAt": {
                    "label": "Published",
                    "format": "text"
                  }
                }
              }
            },
            "full": {
              "title": "Full Details",
              "transformation": {
                "fields": [
                  "hashtag",
                  "hashtagUrl",
                  "hashtagTitle",
                  "videoCountText",
                  "videoCount",
                  "channelCountText",
                  "channelCount",
                  "position",
                  "recordType",
                  "success",
                  "type",
                  "videoId",
                  "title",
                  "url",
                  "channelName",
                  "channelId",
                  "channelUrl",
                  "channelHandle",
                  "channelAvatarUrl",
                  "channelSubscriberCountText",
                  "channelSubscriberCount",
                  "viewCountText",
                  "viewCount",
                  "likeCountText",
                  "likeCount",
                  "commentCountText",
                  "commentCount",
                  "publishedTimeText",
                  "publishedAt",
                  "durationText",
                  "durationSeconds",
                  "thumbnailUrl",
                  "isShort",
                  "description",
                  "keywords",
                  "category",
                  "badges",
                  "scrapedAt",
                  "errorCode",
                  "error"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "hashtag": {
                    "label": "Hashtag",
                    "format": "text"
                  },
                  "hashtagUrl": {
                    "label": "Hashtag URL",
                    "format": "link"
                  },
                  "hashtagTitle": {
                    "label": "Hashtag Title",
                    "format": "text"
                  },
                  "videoCountText": {
                    "label": "Total Videos",
                    "format": "text"
                  },
                  "videoCount": {
                    "label": "Total Video Count",
                    "format": "number"
                  },
                  "channelCountText": {
                    "label": "Total Channels",
                    "format": "text"
                  },
                  "channelCount": {
                    "label": "Total Channel Count",
                    "format": "number"
                  },
                  "position": {
                    "label": "Position",
                    "format": "number"
                  },
                  "recordType": {
                    "label": "Record Type",
                    "format": "text"
                  },
                  "success": {
                    "label": "Success",
                    "format": "boolean"
                  },
                  "type": {
                    "label": "Type",
                    "format": "text"
                  },
                  "videoId": {
                    "label": "Video ID",
                    "format": "text"
                  },
                  "title": {
                    "label": "Title",
                    "format": "text"
                  },
                  "url": {
                    "label": "URL",
                    "format": "link"
                  },
                  "channelName": {
                    "label": "Channel",
                    "format": "text"
                  },
                  "channelId": {
                    "label": "Channel ID",
                    "format": "text"
                  },
                  "channelUrl": {
                    "label": "Channel URL",
                    "format": "link"
                  },
                  "channelHandle": {
                    "label": "Channel Handle",
                    "format": "text"
                  },
                  "channelAvatarUrl": {
                    "label": "Channel Avatar",
                    "format": "link"
                  },
                  "channelSubscriberCountText": {
                    "label": "Subscribers",
                    "format": "text"
                  },
                  "channelSubscriberCount": {
                    "label": "Subscriber Count",
                    "format": "number"
                  },
                  "viewCountText": {
                    "label": "Views",
                    "format": "text"
                  },
                  "viewCount": {
                    "label": "View Count",
                    "format": "number"
                  },
                  "likeCountText": {
                    "label": "Likes",
                    "format": "text"
                  },
                  "likeCount": {
                    "label": "Like Count",
                    "format": "number"
                  },
                  "commentCountText": {
                    "label": "Comments (label)",
                    "format": "text"
                  },
                  "commentCount": {
                    "label": "Comments",
                    "format": "number"
                  },
                  "publishedTimeText": {
                    "label": "Published (relative)",
                    "format": "text"
                  },
                  "publishedAt": {
                    "label": "Published At",
                    "format": "text"
                  },
                  "durationText": {
                    "label": "Duration",
                    "format": "text"
                  },
                  "durationSeconds": {
                    "label": "Duration (seconds)",
                    "format": "number"
                  },
                  "thumbnailUrl": {
                    "label": "Thumbnail",
                    "format": "link"
                  },
                  "isShort": {
                    "label": "Is Short",
                    "format": "boolean"
                  },
                  "description": {
                    "label": "Description",
                    "format": "text"
                  },
                  "keywords": {
                    "label": "Keywords",
                    "format": "text"
                  },
                  "category": {
                    "label": "Category",
                    "format": "text"
                  },
                  "badges": {
                    "label": "Badges",
                    "format": "text"
                  },
                  "scrapedAt": {
                    "label": "Scraped At",
                    "format": "text"
                  },
                  "errorCode": {
                    "label": "Error Code",
                    "format": "text"
                  },
                  "error": {
                    "label": "Error",
                    "format": "text"
                  }
                }
              }
            }
          }
        }
      }
    },
    "buildNumber": "1.0.2",
    "imageDigest": "cc7b409c92698093947a65d23a15a50513c8cc0b6e94a5b4de00785556531d4f",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "1.0"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.005604444444444444
    }
  }
}