{
  "openapi": "3.0.1",
  "info": {
    "title": "YouTube Competitor Channel Monitor",
    "description": "Monitor competitor YouTube channels and get only what changed: new videos, Shorts and live streams, breakout videos versus each channel's own baseline, view and subscriber surges, upload cadence and content-mix shifts, plus a cross-competitor ranking. No login, no API key needed.",
    "version": "1.0",
    "x-build-id": "BwMPIm8ejtMQHyorh"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/coregent~youtube-competitor-channel-monitor/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-coregent-youtube-competitor-channel-monitor",
        "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/coregent~youtube-competitor-channel-monitor/runs": {
      "post": {
        "operationId": "runs-sync-coregent-youtube-competitor-channel-monitor",
        "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/coregent~youtube-competitor-channel-monitor/run-sync": {
      "post": {
        "operationId": "run-sync-coregent-youtube-competitor-channel-monitor",
        "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",
        "required": [
          "channels"
        ],
        "properties": {
          "channels": {
            "title": "Competitor channels",
            "type": "array",
            "description": "The YouTube channels to monitor, up to 500 per run.\n\nEach entry can be:\n- a handle: `@mkbhd`\n- a channel URL: `https://www.youtube.com/@veritasium` or `https://www.youtube.com/channel/UC...`\n- a channel ID: `UCBJycsmduvYEL83R_U4JriQ`\n- a video URL (resolved to the channel that uploaded it)\n\nThe same channel listed twice is checked once.",
            "items": {
              "type": "string"
            },
            "default": [
              "@mkbhd",
              "@veritasium"
            ]
          },
          "monitorKey": {
            "title": "Monitor name",
            "type": "string",
            "description": "Name for this monitor's saved state, such as `tech-competitors` or `client-a`. Use the same name on every scheduled run so the monitor remembers what it has already seen. Different names keep separate histories, even for the same channel.",
            "default": "my-competitors"
          },
          "mode": {
            "title": "Mode",
            "enum": [
              "MONITOR",
              "BASELINE",
              "COMPARE"
            ],
            "type": "string",
            "description": "- **Monitor (recommended)**: reports only what changed since the last run. On a channel's first run it saves a baseline instead and does not report old videos as new.\n- **Baseline**: saves or resets the current state without reporting changes.\n- **Compare**: returns a current summary and ranking for every channel. It does not change the saved state, so the next Monitor run still reports everything new.",
            "default": "MONITOR"
          },
          "contentTypes": {
            "title": "Content types",
            "type": "array",
            "description": "The kinds of content to watch. Long-form **Videos** include premieres.",
            "items": {
              "type": "string",
              "enum": [
                "VIDEOS",
                "SHORTS",
                "LIVE"
              ],
              "enumTitles": [
                "Videos (long-form)",
                "Shorts",
                "Live streams"
              ]
            },
            "default": [
              "VIDEOS",
              "SHORTS"
            ]
          },
          "lookbackDays": {
            "title": "Lookback window (days)",
            "minimum": 1,
            "maximum": 365,
            "type": "integer",
            "description": "The recent period used for new-content reports, content mix, median recent views and title keywords. Videos published before this window are never reported as new. Common values are 7, 14, 30 and 90.",
            "default": 30
          },
          "maxRecentVideosPerChannel": {
            "title": "Recent items per content type",
            "minimum": 5,
            "maximum": 200,
            "type": "integer",
            "description": "How many of the newest items to read for each content type on each channel. For example, 30 means up to 30 videos and 30 Shorts. Raise it for channels that post many times a day.",
            "default": 30
          },
          "onlyNewContent": {
            "title": "Only report genuinely new uploads",
            "type": "boolean",
            "description": "When on, an older video the monitor sees for the first time (for example after you raise the item count) is saved but not reported as new. Turn it off to report those too. They are marked `newToMonitor: true` with LOW confidence.",
            "default": true
          },
          "emitBaselineContent": {
            "title": "Report recent videos on the first run",
            "type": "boolean",
            "description": "When on, a channel's first run also reports the videos already in the lookback window, marked `newToMonitor: true`. When off, the first run only saves the baseline.",
            "default": false
          },
          "trackVideoMetricChanges": {
            "title": "Track video metric changes",
            "type": "boolean",
            "description": "Keep refreshing recent videos and report `VIDEO_METRICS_UPDATED` when views, likes or comments grow past the thresholds below.",
            "default": true
          },
          "videoMetricTrackingDays": {
            "title": "Refresh videos for (days after publish)",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "How many days after publishing a video keeps being refreshed. Breakout videos are refreshed for up to 30 days. Common values are 1, 3, 7, 14 and 30.",
            "default": 7
          },
          "minimumViewGrowthPct": {
            "title": "Minimum view growth (%)",
            "minimum": 0,
            "maximum": 10000,
            "type": "integer",
            "description": "The percentage growth in views since the last report that counts as an update. It works together with the minimum view increase below.",
            "default": 20
          },
          "minimumViewDelta": {
            "title": "Minimum view increase",
            "minimum": 0,
            "type": "integer",
            "description": "The number of extra views since the last report that counts as an update. Also the smallest total-view gain for a channel view surge.",
            "default": 1000
          },
          "minimumLikeGrowthPct": {
            "title": "Minimum like growth (%)",
            "minimum": 0,
            "maximum": 10000,
            "type": "integer",
            "description": "The percentage growth in likes since the last report that counts as an update.",
            "default": 20
          },
          "minimumCommentDelta": {
            "title": "Minimum comment increase",
            "minimum": 0,
            "type": "integer",
            "description": "The number of extra comments since the last report that counts as an update.",
            "default": 50
          },
          "includeRecentPerformance": {
            "title": "Channel-relative performance",
            "type": "boolean",
            "description": "Compare each video with the channel's own recent videos at a similar age (`performanceIndex`) and detect breakouts.",
            "default": true
          },
          "performanceBaselineVideos": {
            "title": "Baseline size (videos)",
            "minimum": 3,
            "maximum": 50,
            "type": "integer",
            "description": "How many of the channel's previous videos of the same kind (Shorts, long-form or live) make up the baseline. Common values are 5, 10, 20 and 30.",
            "default": 10
          },
          "breakoutMinTier": {
            "title": "Breakout alert level",
            "enum": [
              "STRONG",
              "BREAKOUT",
              "EXCEPTIONAL"
            ],
            "type": "string",
            "description": "The lowest tier that triggers `VIDEO_BREAKOUT`.\n- **Strong**: 1.5× the channel baseline or more\n- **Breakout**: 2.5× or more\n- **Exceptional**: 5× or more\n\nA video is reported again only if it moves up a tier.",
            "default": "BREAKOUT"
          },
          "minimumBreakoutViews": {
            "title": "Minimum views for a breakout",
            "minimum": 0,
            "type": "integer",
            "description": "Ignore breakouts on videos with fewer views than this, so a small channel's 300-view video is not flagged.",
            "default": 1000
          },
          "includeUnderperforming": {
            "title": "Report underperforming videos",
            "type": "boolean",
            "description": "Report `VIDEO_UNDERPERFORMING` when a video at least a day old has 0.4× or less of the channel's views at the same age. Off by default to avoid negative noise.",
            "default": false
          },
          "includeChannelGrowth": {
            "title": "Channel growth",
            "type": "boolean",
            "description": "Track subscriber, total-view and video-count changes since the last run, and report view or subscriber surges.",
            "default": true
          },
          "channelSurgeMultiplier": {
            "title": "Surge multiplier",
            "minimum": 1.1,
            "maximum": 100,
            "type": "number",
            "description": "A channel is surging when its views (or subscribers) per day since the last run are at least this many times its median daily rate over the previous 7 days.",
            "default": 2
          },
          "cadenceChangePct": {
            "title": "Upload frequency change (%)",
            "minimum": 5,
            "maximum": 1000,
            "type": "integer",
            "description": "How much uploads per week must change before `UPLOAD_FREQUENCY_INCREASED` or `UPLOAD_FREQUENCY_DECREASED` is reported. The last 30 days are compared with the 30 days before, when that history is known.",
            "default": 50
          },
          "dormantAfterDays": {
            "title": "Dormant after (days without uploads)",
            "minimum": 3,
            "maximum": 365,
            "type": "integer",
            "description": "Report `CHANNEL_DORMANT` once when a channel has not uploaded in this many days.",
            "default": 30
          },
          "includeContentMix": {
            "title": "Content mix",
            "type": "boolean",
            "description": "Track the share of Shorts, long-form and live in the lookback window, and report `SHORTS_SHARE_INCREASED` or `CONTENT_MIX_CHANGED`. This needs at least two content types.",
            "default": true
          },
          "includeTitleKeywordAnalysis": {
            "title": "Title keywords",
            "type": "boolean",
            "description": "Find recurring, new and rising words and phrases in each channel's recent titles. Simple word counting is used, not AI.",
            "default": true
          },
          "includeChannelSummaryRows": {
            "title": "Channel summary rows",
            "type": "boolean",
            "description": "Add one `CHANNEL_CHECKED` row per channel with its status, cadence, content mix, growth, keywords and competitor rank. These rows mean every run has output, even when nothing changed.",
            "default": true
          },
          "includeThumbnailUrls": {
            "title": "Include thumbnail and avatar URLs",
            "type": "boolean",
            "description": "Include video thumbnail, channel avatar and channel banner URLs in the output.",
            "default": true
          },
          "alertEventTypes": {
            "title": "Alert event types",
            "type": "array",
            "description": "Events that get `alertTriggered: true`. Filter on that field in a webhook, Slack, Make, Zapier or n8n integration.",
            "items": {
              "type": "string",
              "enum": [
                "NEW_VIDEO",
                "NEW_SHORT",
                "NEW_LIVE_STREAM",
                "NEW_PREMIERE",
                "VIDEO_METRICS_UPDATED",
                "VIDEO_BREAKOUT",
                "VIDEO_UNDERPERFORMING",
                "CHANNEL_GROWTH_SURGE",
                "CHANNEL_VIEW_SURGE",
                "UPLOAD_FREQUENCY_INCREASED",
                "UPLOAD_FREQUENCY_DECREASED",
                "SHORTS_SHARE_INCREASED",
                "CONTENT_MIX_CHANGED",
                "HANDLE_CHANGED",
                "CHANNEL_DORMANT"
              ]
            },
            "default": [
              "NEW_VIDEO",
              "NEW_SHORT",
              "NEW_LIVE_STREAM",
              "NEW_PREMIERE",
              "VIDEO_BREAKOUT",
              "CHANNEL_VIEW_SURGE",
              "CHANNEL_GROWTH_SURGE",
              "UPLOAD_FREQUENCY_INCREASED",
              "CHANNEL_DORMANT"
            ]
          },
          "saveHistory": {
            "title": "Save history dataset",
            "type": "boolean",
            "description": "Also append each run's channel observations and events to the named dataset `youtube-competitor-monitor-history` in your account. This builds a long-term log across runs.",
            "default": true
          },
          "maxConcurrency": {
            "title": "Channels checked in parallel",
            "minimum": 1,
            "maximum": 15,
            "type": "integer",
            "description": "How many channels are checked at the same time.",
            "default": 5
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Used only when the actor falls back to reading public YouTube pages. Most runs need no proxy. Apify Residential proxy is not supported. Use Apify Datacenter, or your own provider through Custom proxy URLs.",
            "default": {
              "useApifyProxy": false
            }
          },
          "debug": {
            "title": "Debug logging",
            "type": "boolean",
            "description": "Log more detail about each request.",
            "default": 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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}