{
  "openapi": "3.0.1",
  "info": {
    "title": "YouTube Shorts Scraper: Channels, Hashtags & Search",
    "description": "Scrape YouTube Shorts from channels, hashtags and search queries in one run: exact views and likes, comments count, publish date, duration, hashtags and channel stats. Duplicates removed before billing, new-Shorts-only monitoring with webhook. No browser.",
    "version": "0.1",
    "x-build-id": "kcxrYQibvdy7iP7E0"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/alexmorain~youtube-shorts-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-alexmorain-youtube-shorts-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/alexmorain~youtube-shorts-scraper/runs": {
      "post": {
        "operationId": "runs-sync-alexmorain-youtube-shorts-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/alexmorain~youtube-shorts-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-alexmorain-youtube-shorts-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "channels": {
            "title": "Channels",
            "type": "array",
            "description": "YouTube channels to read Shorts from. One per line, in any form: <code>@MrBeast</code>, <code>MrBeast</code>, <code>https://www.youtube.com/@MrBeast/shorts</code>, <code>https://www.youtube.com/channel/UC...</code>, an old <code>/c/</code> or <code>/user/</code> URL, or the channel ID itself.<br><br>A channel without a Shorts tab, or a handle that does not exist, gets one error row in the dataset (field <code>error</code>), never charged, and the run goes on with the other sources.",
            "items": {
              "type": "string"
            }
          },
          "hashtags": {
            "title": "Hashtags",
            "type": "array",
            "description": "Hashtags whose Shorts feed you want, with or without <code>#</code>: <code>cooking</code>, <code>#asmr</code>, or a <code>https://www.youtube.com/hashtag/...</code> link. The feed is the one YouTube shows on <code>youtube.com/hashtag/&lt;tag&gt;/shorts</code>, ranked by YouTube, not by date.",
            "items": {
              "type": "string"
            }
          },
          "searchQueries": {
            "title": "Search queries",
            "type": "array",
            "description": "Keywords to search, with YouTube's Shorts filter on, so only Shorts come back. One query per line.<br><br>YouTube serves the same Short several times as you scroll a search: on 8 pages we measured 28 to 44 % repeats. The Actor drops them before they reach the dataset, so you are never charged twice. A search also runs dry after roughly 100 to 200 unique Shorts, whatever the maximum you set.",
            "items": {
              "type": "string"
            }
          },
          "shortUrls": {
            "title": "Short URLs",
            "type": "array",
            "description": "Individual Shorts to fetch: <code>https://www.youtube.com/shorts/&lt;id&gt;</code>, <code>youtu.be/&lt;id&gt;</code>, <code>watch?v=&lt;id&gt;</code> or the 11-character ID. Useful to refresh the counters of Shorts you already track.",
            "items": {
              "type": "string"
            }
          },
          "maxResultsPerSource": {
            "title": "Max Shorts per source",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "How many Shorts to take from each channel, hashtag or search, counted from the top of its feed.<br><br>In <b>New Shorts only</b> mode it is how deep each run looks: with 50, every run checks the 50 latest Shorts of each channel and returns only those it never returned before.",
            "default": 50
          },
          "maxItems": {
            "title": "Max Shorts in total",
            "minimum": 1,
            "type": "integer",
            "description": "Stop the whole run after this many Shorts, all sources together. Leave empty for no total limit. The run's maximum charge, set in the run options, also stops it cleanly."
          },
          "sortChannelShortsBy": {
            "title": "Channel order",
            "enum": [
              "NEWEST",
              "POPULAR",
              "OLDEST"
            ],
            "type": "string",
            "description": "Which end of a channel's Shorts tab to start from, the three buttons at the top of the tab. Applies to channels only.",
            "default": "NEWEST"
          },
          "oldestPostDate": {
            "title": "Published on or after",
            "type": "string",
            "description": "Keep only Shorts published on or after this date, or within a span such as <code>7 days</code> (<code>1 day</code> means today). No extra charge for using it: you pay for the Shorts returned, nothing else.<br><br>On a channel read latest first, the Actor stops paging as soon as it reaches older Shorts. The comparison is by day, as YouTube displays it (US Pacific calendar)."
          },
          "searchUploadedWithin": {
            "title": "Search: uploaded within",
            "enum": [
              "any",
              "today",
              "week",
              "month",
              "year"
            ],
            "type": "string",
            "description": "YouTube's own upload-date filter, applied by YouTube to search queries. Use it with <b>Published on or after</b> for an exact cut-off.<br><br>Not offered on purpose: sorting a Shorts search by upload date or by views. We tested both on 18 October 2026: the first does not sort, the second returns nothing.",
            "default": "any"
          },
          "country": {
            "title": "Country",
            "pattern": "^[A-Za-z]{2}$",
            "type": "string",
            "description": "Two-letter country code (<code>US</code>, <code>FR</code>, <code>BR</code>, <code>JP</code>...) used for searches and hashtags. YouTube ranks them per country: the same search in the US and in Brazil shares about a third of its first results. Channels are not affected.",
            "default": "US"
          },
          "extendedDetails": {
            "title": "Duration and exact publish time",
            "type": "boolean",
            "description": "Adds the duration, the exact publish time (UTC, to the second), the category and the family-safe flag. It takes one extra small request per Short.<br><br>A Short that comes with these details is charged as a <b>Detailed Short</b> ($3.00 per 1,000 instead of $2.00 at the entry price). If YouTube refuses that request for a Short, these fields stay empty, every other field is still filled, and the Short is charged at the normal price. Turn it off for a faster, cheaper run when you only need counts and dates.",
            "default": true
          },
          "mode": {
            "title": "Mode",
            "enum": [
              "all",
              "new-only"
            ],
            "type": "string",
            "description": "<b>All Shorts</b> returns every Short within your limits, on every run.<br><br><b>New Shorts only</b> keeps a memory of the Shorts previous runs returned, per source, and returns only the ones never returned before. Schedule it daily on a list of channels or hashtags and you get a feed of new Shorts: a Short already returned is not fetched again and not charged. The first run returns everything, since nothing has been seen yet. Adding a channel to the list does not reset the memory of the others.",
            "default": "all"
          },
          "registryKey": {
            "title": "Memory name",
            "type": "string",
            "description": "Only used by <b>New Shorts only</b>. Leave empty and each source keeps its own memory, found again by any run that has the same source. Set a name to keep separate memories for the same channels (two clients, two projects), or a new name to start over."
          },
          "webhookUrl": {
            "title": "Webhook URL",
            "type": "string",
            "description": "If set, the Actor POSTs a JSON summary to this URL at the end of the run, <b>only when at least one Short was returned</b>: <code>runId</code>, <code>datasetId</code>, <code>mode</code>, <code>shorts</code> (count) and <code>items</code>, the first 100 Shorts with ID, URL, title, channel, views, likes and date. With <b>New Shorts only</b> on a schedule, that is a ping to Slack, Zapier, Make or n8n when a tracked channel posts.<br><br>Stored encrypted, since a webhook URL often contains a token. An unreachable webhook is logged and never fails the run."
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Leave this off. Requests go to YouTube directly; if YouTube starts refusing them, the Actor moves on its own to Apify datacenter proxies, and the optional duration lookup always uses a residential proxy. Both are at no cost to you.",
            "default": {
              "useApifyProxy": false
            }
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}