{
  "openapi": "3.0.1",
  "info": {
    "title": "🔍 YouTube Channel Finder",
    "description": "YouTube Creator Analytics helps discover YouTube channels based on keywords, topics, or niches. It extracts channel details like name, URL, subscriber count, and description. Perfect for influencer outreach, market research, or tracking niche creators to support targeted marketing strategies.",
    "version": "0.0",
    "x-build-id": "woYQp7fZEWbxUVcki"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scraper-engine~youtube-channel-finder/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scraper-engine-youtube-channel-finder",
        "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/scraper-engine~youtube-channel-finder/runs": {
      "post": {
        "operationId": "runs-sync-scraper-engine-youtube-channel-finder",
        "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/scraper-engine~youtube-channel-finder/run-sync": {
      "post": {
        "operationId": "run-sync-scraper-engine-youtube-channel-finder",
        "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": {
          "keywords": {
            "title": "🔍 Search Keywords",
            "type": "array",
            "description": "Search terms to find YouTube channels (e.g. \"cooking tutorials\", \"tech reviews\"). One keyword per line. Combine with \"Max channels per search term\" to control how many channels to analyze per term.",
            "items": {
              "type": "string"
            }
          },
          "channelCount": {
            "title": "📺 Max channels per search term",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "Maximum channels to analyze for each search keyword (1–50). Higher values return more results but take longer (each channel also fetches a small recent-videos sample for analytics). Example: 10. Default is 10.",
            "default": 10
          },
          "searchRegion": {
            "title": "🌍 Search Region",
            "enum": [
              "US",
              "GB",
              "CA",
              "AU",
              "IN",
              "DE",
              "FR",
              "JP",
              "BR",
              "MX",
              "ES",
              "IT",
              "NL",
              "PL",
              "RU",
              "KR",
              "TW"
            ],
            "type": "string",
            "description": "YouTube search region (country code). Affects which channels appear in search results. Default is US.",
            "default": "US"
          },
          "language": {
            "title": "🗣️ Language",
            "enum": [
              "en",
              "es",
              "de",
              "fr",
              "pt",
              "ja",
              "hi",
              "zh",
              "ko",
              "ar",
              "ru"
            ],
            "type": "string",
            "description": "Interface and result language code (e.g. en for English). Default is en.",
            "default": "en"
          },
          "fromDate": {
            "title": "📅 From Date (Joined After)",
            "type": "string",
            "description": "Only include channels that joined on or after this date. Supports absolute (YYYY-MM-DD) or relative (e.g. \"3 months\") values. Leave empty for no filter."
          },
          "toDate": {
            "title": "📅 To Date (Joined Before)",
            "type": "string",
            "description": "Only include channels that joined on or before this date. Supports absolute (YYYY-MM-DD) or relative values. Leave empty for no filter."
          },
          "minSubscribers": {
            "title": "👥 Min subscribers",
            "minimum": 0,
            "type": "integer",
            "description": "Drop channels with fewer than this many subscribers (parsed from the scraped subscriber count). Example: minSubscribers=10000 keeps only channels with 10K+ subs. Leave empty for no minimum."
          },
          "maxSubscribers": {
            "title": "👥 Max subscribers",
            "minimum": 0,
            "type": "integer",
            "description": "Drop channels with more than this many subscribers. Example: maxSubscribers=500000 focuses on mid-tier creators. Leave empty for no maximum."
          },
          "minTotalViews": {
            "title": "👁️ Min lifetime views",
            "minimum": 0,
            "type": "integer",
            "description": "Drop channels whose lifetime channel view count is below this. Example: minTotalViews=1000000. Leave empty for no minimum."
          },
          "country": {
            "title": "🌐 Country contains",
            "type": "string",
            "description": "Keep only channels whose scraped location contains this text (case-insensitive). Example: country=\"United States\" or country=\"India\". Leave empty for no country filter."
          },
          "uploadedWithinDays": {
            "title": "🕒 Uploaded within (days)",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only channels whose most recent sampled upload is within this many days (requires the recent-videos sample). Example: uploadedWithinDays=30 keeps actively-uploading channels. Leave empty to ignore recency."
          },
          "requireEmail": {
            "title": "📧 Require contact email",
            "type": "boolean",
            "description": "When on, only emit channels where a contact email was found in the description or links. Default is off.",
            "default": false
          },
          "sortBy": {
            "title": "↕️ Sort results by",
            "enum": [
              "subscribers",
              "views",
              "recentViews",
              "engagement",
              "momentum",
              "consistency",
              "contactability"
            ],
            "type": "string",
            "description": "Rows save to the dataset live as each channel finishes analysis, so this does not reorder the saved output — use it as a hint for which metric matters most, then sort/export the dataset table by that column afterward."
          },
          "nicheOverride": {
            "title": "🏷️ Niche override",
            "type": "string",
            "description": "Force the detectedNiche label for every channel instead of keyword-classifying it (e.g. finance, gaming, software). Leave empty to auto-detect from keyword + description."
          },
          "maxRecentVideos": {
            "title": "🎬 Recent videos to sample",
            "minimum": 0,
            "maximum": 30,
            "type": "integer",
            "description": "How many recent videos to fetch per channel to power engagement, momentum, cadence and consistency. 0 disables recent-video analytics (subscriber/view/age metrics still compute). Higher = deeper analytics but slower. Example: 6. Default is 6.",
            "default": 6
          },
          "aiEnhancement": {
            "title": "🤖 Enable AI enrichment (optional)",
            "type": "boolean",
            "description": "Optional. Uses an LLM to refine the niche label and add an audience descriptor + lead-quality read from the channel's description. The niche is already keyword-classified, so this is a nice-to-have. Requires an API key below. Default is off.",
            "default": false
          },
          "aiModel": {
            "title": "🤖 AI Model / Provider",
            "enum": [
              "claude-haiku-4-5",
              "claude-sonnet-5",
              "claude-opus-4-8",
              "claude-fable-5",
              "gpt-4o-mini",
              "gpt-4o",
              "gpt-4.1-mini",
              "gpt-4.1",
              "o3-mini",
              "o1",
              "gemini-2.0-flash-lite",
              "gemini-2.0-flash",
              "gemini-1.5-pro",
              "gemini-2.5-flash",
              "gemini-2.5-pro",
              "grok-2-latest",
              "grok-3-mini",
              "grok-3",
              "grok-beta",
              "deepseek-chat",
              "deepseek-reasoner",
              "sonar",
              "sonar-pro",
              "sonar-reasoning",
              "mistral-small-latest",
              "mistral-large-latest"
            ],
            "type": "string",
            "description": "Provider auto-detected from the name: claude-*=Anthropic, gpt-*/o1/o3=OpenAI, gemini-*=Google, grok-*=xAI, deepseek-*=DeepSeek, sonar*=Perplexity, mistral-*=Mistral. Cheaper mini/flash/haiku/lite models are recommended for classification.",
            "default": "claude-haiku-4-5"
          },
          "aiApiKey": {
            "title": "🔑 AI API Key",
            "type": "string",
            "description": "Secret API key for the selected provider. If omitted, the actor falls back to the provider env var (ANTHROPIC_API_KEY / OPENAI_API_KEY / GEMINI_API_KEY / XAI_API_KEY / DEEPSEEK_API_KEY / PERPLEXITY_API_KEY / MISTRAL_API_KEY). Only used when AI enrichment is enabled."
          },
          "urls": {
            "title": "🔗 YouTube URLs",
            "type": "array",
            "description": "Analyze specific channels directly by URL (channel or video URLs). Runs alongside keyword search.",
            "items": {
              "type": "string"
            }
          },
          "proxyConfiguration": {
            "title": "🌐 Proxy configuration",
            "type": "object",
            "description": "Optional. By default the actor runs without a proxy. Enable Apify Proxy here for higher volume or to reduce blocks. If the chosen proxy gets blocked, the actor automatically falls back to Residential proxy and continues."
          }
        }
      },
      "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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}