{
  "openapi": "3.0.1",
  "info": {
    "title": "YouTube Shorts Scraper — Hashtag, Keyword & Channel | $1.50/1k",
    "description": "Scrape YouTube Shorts by hashtag, keyword search, channel or link, no API key or quota. Exact views, likes, comments, publish date, description, hashtags and channel per Short.",
    "version": "0.1",
    "x-build-id": "IB4yvPEQuo7VEN7ay"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/glasswing~youtube-shorts-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-glasswing-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/glasswing~youtube-shorts-scraper/runs": {
      "post": {
        "operationId": "runs-sync-glasswing-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/glasswing~youtube-shorts-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-glasswing-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": {
          "hashtags": {
            "title": "Hashtags",
            "type": "array",
            "description": "Hashtags whose Shorts feed to read, one per line, with or without the # (cooking, #fitness, #日本). This is the youtube.com/hashtag/<tag>/shorts page. Each hashtag returns up to 'Max Shorts per source'. Repeats inside a feed are removed, so each Short appears once per hashtag.",
            "items": {
              "type": "string"
            }
          },
          "searchQueries": {
            "title": "Search terms",
            "type": "array",
            "description": "Keywords to search for Shorts, one per line, exactly as you would type them in the YouTube search box. The search always uses YouTube's Shorts filter. A single keyword search stops after about 80-100 Shorts, so split broad topics into several terms.",
            "items": {
              "type": "string"
            }
          },
          "channels": {
            "title": "Channels",
            "type": "array",
            "description": "Channels whose Shorts tab to read: @handle, channel link (youtube.com/@name, /channel/UC..., /c/, /user/) or channel ID (UC...). A bare name is read as @name. Use 'Channel sort order' for Latest, Popular or Oldest.",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "YouTube links",
            "uniqueItems": true,
            "type": "array",
            "description": "Any mix of Shorts links (youtube.com/shorts/ID, also youtu.be and watch?v= links, read as Shorts), video IDs, channel links (always read as their Shorts tab), hashtag links (youtube.com/hashtag/cooking) and search links (youtube.com/results?search_query=..., searched with the Shorts filter). Playlists are not supported. If you call the Actor with hashtags, search terms or channels only, the built-in example channel is skipped automatically.",
            "default": [
              "https://www.youtube.com/@TED/shorts"
            ],
            "items": {
              "type": "string"
            }
          },
          "maxItems": {
            "title": "Maximum results (total)",
            "minimum": 1,
            "type": "integer",
            "description": "Stop after this many Shorts have been saved in total. Each saved row with status `ok` is one billable Short ($1.50 per 1,000); rows with status `not_found` or `error` are free. Keep it small for test runs.",
            "default": 20
          },
          "maxResultsPerSource": {
            "title": "Max Shorts per source",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Cap for each hashtag, each search term and each channel (up to 5,000). YouTube pages through about 20-50 Shorts per request; a keyword search ends after about 80-100 Shorts, while hashtag feeds and channels go deeper.",
            "default": 10
          },
          "includeVideoDetails": {
            "title": "Include Short details",
            "type": "boolean",
            "description": "Also open every Short to add the exact view count, like count, comment count, publish date, full description, hashtags, channel name and ID and the channel's subscriber count. One extra request per Short; the price per Short stays the same. Switch it off for faster list-only runs (title, rounded views and the source only).",
            "default": true
          },
          "channelSort": {
            "title": "Channel sort order",
            "enum": [
              "newest",
              "popular",
              "oldest"
            ],
            "type": "string",
            "description": "Order of a channel's Shorts, the same chips YouTube shows on the channel's Shorts tab.",
            "default": "newest"
          },
          "uploadDate": {
            "title": "Upload date",
            "enum": [
              "any",
              "hour",
              "today",
              "week",
              "month",
              "year"
            ],
            "type": "string",
            "description": "Search terms only: Shorts uploaded within this period (YouTube's own filter). YouTube applies its date and popularity filters to Shorts unevenly: for some terms a filtered Shorts search returns few or no Shorts (then the term gets one free not_found row).",
            "default": "any"
          },
          "sortBy": {
            "title": "Sort search results by",
            "enum": [
              "relevance",
              "views"
            ],
            "type": "string",
            "description": "Search terms only: relevance (YouTube's default) or popularity (view count).",
            "default": "relevance"
          },
          "query": {
            "title": "Search term (single, optional)",
            "type": "string",
            "description": "Same as one entry in 'Search terms', for API callers and AI agents that send a single string. Sent on its own, it skips the built-in example channel."
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Apify Proxy (datacenter, the default group) is on by default: YouTube starts refusing one server's requests after a few hundred pages in a row, and spreading them over datacenter IPs keeps large runs clean. Residential proxies are not needed.",
            "default": {
              "useApifyProxy": true
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}