# Competitor Content Watch: Naver, Blogs & YouTube (`isolovyev/competitor-content-watch`) Actor

Monitor Korean blogs on Naver Blog and Tistory, Japanese note, RSS and YouTube for new posts and updates. Следите за Naver Blog и Tistory (Корея), note (Япония), RSS и YouTube: новые публикации и изменения.

- **URL**: https://apify.com/isolovyev/competitor-content-watch.md
- **Developed by:** [Ivan Solovyev](https://apify.com/isolovyev) (community)
- **Categories:** Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$10.00 / 1,000 successful source checks

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

[English](#english) / [На русском](#русский)

Monitor **Naver Blog and Korean blogs**, public RSS/Atom publications and YouTube channel updates in one repeatable content watch.

Следите за **Naver Blog и корейскими блогами**, публичными публикациями RSS/Atom и обновлениями YouTube в одном наблюдении.

### English

#### Competitor content monitoring for brands and agencies

Follow competitors' product announcements, campaign posts and editorial updates without checking each publication channel manually. Competitor Content Watch combines Naver Blog, Tistory, note, Medium, Substack, WordPress, Ghost, Blogger, DEV, Habr, RSS/Atom feeds and YouTube channels. Supply known sources and optional keywords; get source checks with recent publications and changes between runs.

#### What you get

Each successful source check produces one dataset row containing source identity, check time, selected posts and `NEW` or `UPDATED` events. Posts include titles, public links, feed descriptions and available publication dates. The **Run summary** reports source coverage and errors; **Change digest** combines the run's change events. Export as JSON, CSV or Excel, or retrieve the dataset through Apify's API. JSON preserves the nested `posts` and `changes` arrays.

#### Quick start with Naver Blog

1. Add a Naver Blog profile or one of the feed URLs below to `sources`.
2. Select `monitor` and choose a `watchId` for this monitoring history.
3. Start with a small entry limit, run the Actor and open its dataset and Run summary.
4. Repeat with the same `watchId` to compare new observations with the baseline.

```json
{
  "sources": [
    "https://blog.naver.com/hibizsam"
  ],
  "mode": "monitor",
  "watchId": "naver-brand-watch",
  "maxItemsPerSource": 3,
  "maxSources": 1,
  "keywords": [],
  "includeUnchanged": false,
  "emitBaseline": true
}
```

This example inspects up to three recent entries from one Naver blog. Here is an excerpt from a real source check with the same source and entry limit; the full row also contains IDs, hashes, descriptions, timestamps and `changes`. Titles and dates reflect the feed at collection time.

```json
{
  "recordType": "SOURCE",
  "sourceUrl": "https://blog.naver.com/hibizsam",
  "feedUrl": "https://rss.blog.naver.com/hibizsam.xml",
  "platform": "naver",
  "baseline": true,
  "checkedPostCount": 3,
  "postCount": 3,
  "changeCount": 3,
  "posts": [
    {
      "url": "https://blog.naver.com/hibizsam/224432677374?fromRss=true&trackingCode=rss",
      "title": "비즈몰 각인리뷰] 무료각인 펜텔 그래프1000 꿈결 오로라 샤프 0.5mm 한정판 고급 선물 각인샤프",
      "publishedAt": "2026-10-06T01:14:48+00:00"
    },
    {
      "url": "https://blog.naver.com/hibizsam/224428069319?fromRss=true&trackingCode=rss",
      "title": "비즈몰스토어) 유니볼 젠토 시그니처 회전식 3색볼펜 레이저각인 이벤트 중!",
      "publishedAt": "2026-10-01T02:35:56+00:00"
    },
    {
      "url": "https://blog.naver.com/hibizsam/224428005008?fromRss=true&trackingCode=rss",
      "title": "비즈몰 각인리뷰) 유미 미래 수능 샤프 대량 구매 판촉물 홍보 UV각인 선물 인기 샤프",
      "publishedAt": "2026-10-01T01:43:01+00:00"
    }
  ]
}
```

#### Naver Blog monitoring for Korean blogs

**Naver Blog is a dedicated source for Korean blog monitoring.** Use a public `blog.naver.com` profile URL, a Naver blog ID or its RSS URL. Korean text is preserved in titles and feed descriptions, making the Actor useful for following Korean brands, retailers and promotional content.

**네이버 블로그 모니터링**: 새 글과 RSS 업데이트를 확인하세요.

For the `hibizsam` example, set `keywords` to `["각인", "이벤트"]` to select titles or descriptions mentioning engraving or events. An empty keyword list selects all inspected entries.

#### Supported platforms and public feed URLs

| Platform | Public feed URL or supported source input |
|---|---|
| Naver Blog | `https://blog.naver.com/hibizsam` or `hibizsam`; [RSS feed](https://rss.blog.naver.com/hibizsam.xml) |
| Tistory | [notice.tistory.com/rss](https://notice.tistory.com/rss) |
| note | [note.com/info/rss](https://note.com/info/rss) |
| Medium | [Author](https://medium.com/feed/@ev), [publication](https://medium.com/feed/better-programming), [topic](https://medium.com/feed/tag/artificial-intelligence) |
| Substack | [on.substack.com/feed](https://on.substack.com/feed) |
| WordPress | [wordpress.org/news/feed/](https://wordpress.org/news/feed/) |
| Ghost | [ghost.org/changelog/rss/](https://ghost.org/changelog/rss/) |
| Blogger | [Blogger RSS feed](https://blogger.googleblog.com/feeds/posts/default?alt=rss\&redirect=false) |
| DEV | [dev.to/feed](https://dev.to/feed) |
| Habr | [habr.com/ru/rss/articles/?fl=ru](https://habr.com/ru/rss/articles/?fl=ru) |
| Other RSS/Atom blogs | [blog.google/rss/](https://blog.google/rss/) |
| YouTube | `https://www.youtube.com/channel/UC_x5XG1OV2P6uZZ5FSM9Ttw` or `UC_x5XG1OV2P6uZZ5FSM9Ttw` |

For Tistory, note, Medium, Substack, WordPress, Ghost, Blogger, DEV, Habr and other blogs, paste the **feed URL**, rather than the blog home page. The linked feeds above are concrete examples; replace them with the public feeds you want to watch. Naver profile URLs and YouTube `/channel/UC...` URLs are converted to their corresponding feeds. YouTube also accepts UC channel IDs.

Coverage is the **current public feed window**, bounded by `maxItemsPerSource`. Medium and Substack provide the entries and excerpts exposed in their public feeds. Monitor runs compare this available content with prior observations.

#### Input settings

| Field | Meaning | Default |
|---|---|---|
| `sources` | Up to 20 RSS/Atom URLs, Naver URLs or blog IDs, and YouTube channel URLs or UC IDs | Required |
| `mode` | `snapshot` for the current feed; `monitor` for repeat comparisons | `monitor` |
| `watchId` | Identifier for independent monitoring history | `default` |
| `maxItemsPerSource` | Entries inspected per source, from 1 to 50 | 20 |
| `maxSources` | Supplied sources checked per run, from 1 to 20 | 10 |
| `keywords` | Up to 20 keywords; match any in title or feed description | Empty list selects all |
| `includeUnchanged` | Include previously observed matching entries in `posts` | `false` |
| `emitBaseline` | Include entries from a source's first monitor check | `true` |

Keyword filtering applies to the entries inspected within `maxItemsPerSource`. A successful check still produces a source row when no entries match the filter.

#### Monitor behavior, coverage and scheduling

- `snapshot` returns matching current-feed entries as a baseline with `NEW` events.
- The first successful `monitor` check of each source establishes a baseline. With `emitBaseline: true`, those entries appear in `posts` and `changes`; `baseline: true` identifies the initial snapshot. With `emitBaseline: false`, history is saved while both arrays start empty.
- Later checks produce `NEW` for a newly observed entry and `UPDATED` when its available title, URL or feed description changes. Publication date metadata alone does not create an update event.
- `includeUnchanged: true` includes previously observed matching posts alongside changes. With it set to `false`, `posts` contains new or updated entries. Successful unchanged checks still produce source rows with empty arrays and zero changes.

For a mixed watch, use the same `watchId` on each repeat:

```json
{
  "sources": [
    "https://blog.naver.com/hibizsam",
    "https://blog.google/rss/",
    "https://www.youtube.com/channel/UC_x5XG1OV2P6uZZ5FSM9Ttw"
  ],
  "mode": "monitor",
  "watchId": "competitor-content",
  "maxSources": 3,
  "maxItemsPerSource": 3
}
```

Use Apify Tasks or Schedules to repeat checks. Run one check at a time for each watch ID. Choose a checking frequency suited to the publication pace so that new entries remain in the feed window until a check. Use a new `watchId` when you want a fresh baseline after changing keyword filters.

Monitoring history uses a named key-value store in your Apify account and retains up to 1,000 observed entries per source within 180 days. History is pruned during subsequent monitor runs. A paused schedule leaves stored history subject to the account's storage settings and billing. Entries leaving a feed window do not produce deletion events.

#### Output fields

| Field | Meaning |
|---|---|
| `recordType` | `SOURCE`, one row per successful source check |
| `sourceId`, `sourceUrl`, `feedUrl`, `platform`, `title` | Source identity and feed |
| `observationId`, `observedAt`, `baseline` | Check identity, time and initial-snapshot marker |
| `posts` | Delivered entries with ID, URL, title, description, available dates and content hash |
| `changes` | `NEW` or `UPDATED`, post ID and corresponding post |
| `availablePostCount` | Entries present in the retrieved feed |
| `checkedPostCount` | Entries inspected within the configured limit, before keyword filtering |
| `postCount`, `changeCount` | Delivered entry count and change count |

Dates and links reflect the fields supplied by each feed. Run summary includes source statuses, source errors and collected source-check counts. Use it alongside the dataset to assess coverage.

#### Billing and storage

The billing unit is **one successfully checked source**, including checks with unchanged content, empty feeds or no keyword matches. A run that successfully checks three sources is billed for three source checks, whether those sources deliver one publication or many. Failed checks are not charged, and there is no separate Actor start charge.

The source-check price includes the resources used during the Actor run. Persistent monitoring history and retained outputs follow your Apify account's storage policy and billing. See **Pricing** for the current rate and review the run cost estimate before starting.

#### Questions and support

**Do I need an API key?** The supported public feed inputs require no API key.

**How do I watch a different blog?** Find its public RSS/Atom feed and paste that URL into `sources`. For Naver and YouTube, use the supported profile or channel inputs listed above.

**Where do I report a problem?** Open the Actor's Issues tab and include the source URL, run ID and the source status shown in Run summary.

### Русский

#### Мониторинг контента конкурентов для брендов и агентств

Следите за анонсами товаров, промопубликациями и редакционными обновлениями конкурентов без ручной проверки каждого канала. Competitor Content Watch объединяет Naver Blog, Tistory, note, Medium, Substack, WordPress, Ghost, Blogger, DEV, Habr, ленты RSS/Atom и каналы YouTube. Задайте известные источники и при необходимости ключевые слова: результат покажет проверки источников, свежие публикации и изменения между запусками.

#### Что вы получаете

Каждая успешная проверка источника создает одну строку датасета с идентификатором источника, временем проверки, выбранными публикациями и событиями `NEW` или `UPDATED`. Записи содержат заголовки, публичные ссылки, описания из ленты и доступные даты публикации. Отчет **Run summary** показывает охват и ошибки источников, а **Change digest** объединяет события изменений за запуск. Данные можно экспортировать в JSON, CSV или Excel и получать через API Apify. JSON сохраняет вложенные массивы `posts` и `changes`.

#### Быстрый запуск с Naver Blog

1. Добавьте в `sources` профиль Naver Blog или один из URL лент ниже.
2. Выберите режим `monitor` и задайте `watchId` для этой истории наблюдения.
3. Начните с небольшого числа записей, запустите актор и откройте датасет и Run summary.
4. Повторите запуск с тем же `watchId`, чтобы сравнить новые наблюдения с базовым снимком.

```json
{
  "sources": [
    "https://blog.naver.com/hibizsam"
  ],
  "mode": "monitor",
  "watchId": "naver-brand-watch",
  "maxItemsPerSource": 3,
  "maxSources": 1,
  "keywords": [],
  "includeUnchanged": false,
  "emitBaseline": true
}
```

Пример проверяет до трех свежих записей одного блога Naver. Ниже фрагмент реальной проверки с тем же источником и лимитом записей. Полная строка также содержит идентификаторы, хеши, описания, время проверки и массив `changes`. Заголовки и даты соответствуют ленте на момент сбора.

```json
{
  "recordType": "SOURCE",
  "sourceUrl": "https://blog.naver.com/hibizsam",
  "feedUrl": "https://rss.blog.naver.com/hibizsam.xml",
  "platform": "naver",
  "baseline": true,
  "checkedPostCount": 3,
  "postCount": 3,
  "changeCount": 3,
  "posts": [
    {
      "url": "https://blog.naver.com/hibizsam/224432677374?fromRss=true&trackingCode=rss",
      "title": "비즈몰 각인리뷰] 무료각인 펜텔 그래프1000 꿈결 오로라 샤프 0.5mm 한정판 고급 선물 각인샤프",
      "publishedAt": "2026-10-06T01:14:48+00:00"
    },
    {
      "url": "https://blog.naver.com/hibizsam/224428069319?fromRss=true&trackingCode=rss",
      "title": "비즈몰스토어) 유니볼 젠토 시그니처 회전식 3색볼펜 레이저각인 이벤트 중!",
      "publishedAt": "2026-10-01T02:35:56+00:00"
    },
    {
      "url": "https://blog.naver.com/hibizsam/224428005008?fromRss=true&trackingCode=rss",
      "title": "비즈몰 각인리뷰) 유미 미래 수능 샤프 대량 구매 판촉물 홍보 UV각인 선물 인기 샤프",
      "publishedAt": "2026-10-01T01:43:01+00:00"
    }
  ]
}
```

#### Naver Blog: мониторинг корейских блогов

**Naver Blog поддерживается как отдельная площадка для мониторинга корейских блогов.** Укажите публичную ссылку `blog.naver.com`, идентификатор блога Naver или URL его RSS. Корейский текст сохраняется в заголовках и описаниях ленты: можно следить за корейскими брендами, магазинами и промопубликациями.

**네이버 블로그 모니터링**: 새 글과 RSS 업데이트를 확인하세요.

Для примера `hibizsam` задайте `keywords: ["각인", "이벤트"]`, чтобы выбрать записи с упоминанием гравировки или акций в заголовке либо описании. Пустой список ключевых слов включает все проверяемые записи.

#### Поддерживаемые площадки и URL публичных лент

| Площадка | URL публичной ленты или поддерживаемый вход |
|---|---|
| Naver Blog | `https://blog.naver.com/hibizsam` или `hibizsam`; [RSS](https://rss.blog.naver.com/hibizsam.xml) |
| Tistory | [notice.tistory.com/rss](https://notice.tistory.com/rss) |
| note | [note.com/info/rss](https://note.com/info/rss) |
| Medium | [Автор](https://medium.com/feed/@ev), [Издание](https://medium.com/feed/better-programming), [Тема](https://medium.com/feed/tag/artificial-intelligence) |
| Substack | [on.substack.com/feed](https://on.substack.com/feed) |
| WordPress | [wordpress.org/news/feed/](https://wordpress.org/news/feed/) |
| Ghost | [ghost.org/changelog/rss/](https://ghost.org/changelog/rss/) |
| Blogger | [RSS Blogger](https://blogger.googleblog.com/feeds/posts/default?alt=rss\&redirect=false) |
| DEV | [dev.to/feed](https://dev.to/feed) |
| Habr | [habr.com/ru/rss/articles/?fl=ru](https://habr.com/ru/rss/articles/?fl=ru) |
| Другие блоги RSS/Atom | [blog.google/rss/](https://blog.google/rss/) |
| YouTube | `https://www.youtube.com/channel/UC_x5XG1OV2P6uZZ5FSM9Ttw` или `UC_x5XG1OV2P6uZZ5FSM9Ttw` |

Для Tistory, note, Medium, Substack, WordPress, Ghost, Blogger, DEV, Habr и других блогов вставляйте **URL ленты**, а не главную страницу блога. В таблице приведены конкретные примеры: замените их публичными лентами, за которыми хотите следить. Ссылки на профиль Naver и канал YouTube вида `/channel/UC...` преобразуются в соответствующие ленты. Для YouTube также подходят идентификаторы каналов `UC...`.

Охват проверки: **текущее окно публичной ленты**, до `maxItemsPerSource` записей. Для Medium и Substack собираются записи и фрагменты, доступные в публичных лентах. Режим мониторинга сравнивает этот доступный контент с предыдущими наблюдениями.

#### Параметры входа

| Параметр | Значение | По умолчанию |
|---|---|---|
| `sources` | До 20 URL RSS/Atom, ссылок или идентификаторов Naver, ссылок или UC ID каналов YouTube | Обязательно |
| `mode` | `snapshot`: текущая лента; `monitor`: повторное сравнение | `monitor` |
| `watchId` | Идентификатор независимой истории наблюдения | `default` |
| `maxItemsPerSource` | Число проверяемых записей источника, от 1 до 50 | 20 |
| `maxSources` | Число проверяемых источников из списка, от 1 до 20 | 10 |
| `keywords` | До 20 слов: совпадение с любым словом в заголовке или описании ленты | Пустой список включает все |
| `includeUnchanged` | Включать в `posts` ранее наблюдавшиеся подходящие записи | `false` |
| `emitBaseline` | Включать записи первой проверки источника в режиме monitor | `true` |

Фильтр по словам применяется к записям, проверенным в пределах `maxItemsPerSource`. Успешная проверка создает строку источника и тогда, когда ни одна запись не совпала с фильтром.

#### Поведение мониторинга, охват и расписание

- `snapshot` возвращает подходящие записи текущей ленты как базовый снимок с событиями `NEW`.
- Первая успешная проверка каждого источника в режиме `monitor` создает базовый снимок. При `emitBaseline: true` его записи входят в `posts` и `changes`, а `baseline: true` обозначает первоначальный снимок. При `emitBaseline: false` история сохраняется, но оба массива остаются пустыми.
- Следующие проверки формируют `NEW` для впервые наблюдаемой записи и `UPDATED`, когда изменились ее доступные заголовок, ссылка или описание из ленты. Одно изменение даты не создает событие обновления.
- При `includeUnchanged: true` массив `posts` также включает ранее наблюдавшиеся подходящие записи. При `false` туда попадают новые или измененные записи. Успешная проверка без изменений все равно создает строку источника с пустыми массивами и нулем изменений.

Для совместного наблюдения используйте один и тот же `watchId` при повторных запусках:

```json
{
  "sources": [
    "https://blog.naver.com/hibizsam",
    "https://blog.google/rss/",
    "https://www.youtube.com/channel/UC_x5XG1OV2P6uZZ5FSM9Ttw"
  ],
  "mode": "monitor",
  "watchId": "competitor-content",
  "maxSources": 3,
  "maxItemsPerSource": 3
}
```

Настройте повторные проверки в Apify Tasks или Schedules. Для каждого `watchId` запускайте по одной проверке за раз. Выберите частоту с учетом темпа публикаций, чтобы новые записи оставались в окне ленты до проверки. При смене фильтров задайте новый `watchId`, если нужен свежий базовый снимок.

История мониторинга хранится в именованном key-value store вашего аккаунта Apify: до 1 000 наблюдавшихся записей источника в пределах 180 дней. История очищается от старых записей во время следующих запусков monitor. Остановка расписания сохраняет историю, к которой применяются настройки хранения и тарификация аккаунта. Выход записи из окна ленты не создает событие удаления.

#### Поля результата

| Поле | Значение |
|---|---|
| `recordType` | `SOURCE`: одна строка на успешную проверку источника |
| `sourceId`, `sourceUrl`, `feedUrl`, `platform`, `title` | Идентификаторы источника и ленты |
| `observationId`, `observedAt`, `baseline` | Идентификатор проверки, время и признак первоначального снимка |
| `posts` | Выданные записи: ID, URL, заголовок, описание, доступные даты и хеш контента |
| `changes` | `NEW` или `UPDATED`, ID записи и сама запись |
| `availablePostCount` | Число записей в полученной ленте |
| `checkedPostCount` | Число проверенных записей в пределах лимита до фильтра по словам |
| `postCount`, `changeCount` | Число выданных записей и изменений |

Даты и ссылки соответствуют полям, которые передает лента. Run summary содержит статусы источников, ошибки и число собранных проверок. Используйте его вместе с датасетом для оценки охвата.

#### Оплата и хранение

Единица оплаты: **одна успешная проверка источника**, в том числе без изменений, при пустой ленте или отсутствии совпадений по словам. Если запуск успешно проверил три источника, оплачиваются три проверки независимо от количества полученных публикаций. Неуспешные проверки не оплачиваются, отдельной платы за старт актора нет.

Цена проверки включает ресурсы, использованные во время запуска актора. Постоянное хранение истории наблюдения и сохраненных результатов подчиняется правилам хранения и тарификации вашего аккаунта Apify. Текущий тариф указан в разделе **Pricing**; перед запуском просмотрите оценку расходов.

#### Вопросы и поддержка

**Нужен ли API-ключ?** Для поддерживаемых публичных лент API-ключ не нужен.

**Как следить за другим блогом?** Найдите его публичную ленту RSS/Atom и вставьте URL в `sources`. Для Naver и YouTube подходят входы профиля или канала, перечисленные выше.

**Как сообщить о проблеме?** Откройте вкладку Issues актора и укажите URL источника, ID запуска и статус этого источника из Run summary.

# Actor input Schema

## `sources` (type: `array`):

Public RSS/Atom feed URLs for Tistory, note, Medium, Substack, WordPress, Ghost, Blogger, DEV and Habr; Naver Blog URLs or IDs; YouTube /channel/UC URLs or UC IDs. Enter feed URLs for other blogs, not home pages. One source per line.

## `mode` (type: `string`):

Snapshot collects current entries. Monitor compares each source with stored observations under the same watch ID.

## `watchId` (type: `string`):

Use the same ID across repeat checks. Separate IDs keep independent monitoring histories.

## `maxItemsPerSource` (type: `integer`):

Maximum recent entries to inspect from each source in the current feed window.

## `maxSources` (type: `integer`):

Maximum supplied sources to check in this run.

## `keywords` (type: `array`):

Keep entries matching any keyword in the title or feed description. Korean and other Unicode text are supported. Leave empty to include all entries.

## `includeUnchanged` (type: `boolean`):

Include previously observed entries in the posts array during monitor runs. Every successful source check still produces an observation.

## `emitBaseline` (type: `boolean`):

Include current entries on a source’s first monitor check, marked as a baseline observation.

## Actor input object example

```json
{
  "sources": [
    "https://blog.naver.com/hibizsam"
  ],
  "mode": "monitor",
  "watchId": "default",
  "maxItemsPerSource": 3,
  "maxSources": 2,
  "keywords": [],
  "includeUnchanged": false,
  "emitBaseline": true
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

## `summary` (type: `string`):

No description

## `changes` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "sources": [
        "https://blog.naver.com/hibizsam"
    ],
    "mode": "monitor",
    "watchId": "default",
    "maxItemsPerSource": 3,
    "maxSources": 2,
    "keywords": [],
    "includeUnchanged": false,
    "emitBaseline": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("isolovyev/competitor-content-watch").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "sources": ["https://blog.naver.com/hibizsam"],
    "mode": "monitor",
    "watchId": "default",
    "maxItemsPerSource": 3,
    "maxSources": 2,
    "keywords": [],
    "includeUnchanged": False,
    "emitBaseline": True,
}

# Run the Actor and wait for it to finish
run = client.actor("isolovyev/competitor-content-watch").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "sources": [
    "https://blog.naver.com/hibizsam"
  ],
  "mode": "monitor",
  "watchId": "default",
  "maxItemsPerSource": 3,
  "maxSources": 2,
  "keywords": [],
  "includeUnchanged": false,
  "emitBaseline": true
}' |
apify call isolovyev/competitor-content-watch --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,isolovyev/competitor-content-watch"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/sedR8X1ficLfQ2Wf2/builds/j3j5hH7ANPYe0icWG/openapi.json
