apify-ai-search-visibility-tracker

작성자: apify

브랜드와 경쟁사가 Google AI 개요, Google AI 모드, ChatGPT 검색, Perplexity, Microsoft Copilot 등에서 인용되거나 언급되는지 추적합니다.

npx skills add https://github.com/apify/awesome-skills --skill apify-ai-search-visibility-tracker

AI Search Visibility Tracker

Four workflows covering the full AI visibility lifecycle: discover which prompts matter → find citation opportunities → audit your site → track over time.

All workflows use apify/google-search-scraper for AI search. Workflow C also uses apify/website-content-crawler.

Recommended flow: Run Workflow A to discover prompts → Workflow B to find citation opportunities → Workflow C to audit your site → Workflow D to track everything on a schedule.


Workflow A — Competitor Prompt Discovery

Goal: Find which queries surface a competitor in AI search answers, so you know which prompts are worth monitoring.

Inputs to collect

#InputNotes
1Competitor domain(s)e.g. brightdata.com, scraperapi.com
2Seed topic keywordse.g. "web scraping", "data extraction API"
3AI sourcesDefault: all six (AI Overviews, AI Mode, ChatGPT, Perplexity, Copilot, Gemini)

Workflow

  1. Generate 15–30 candidate queries from seed keywords using these templates:

    • best [topic], [topic] tools, how to [topic], [topic] for [use case]
    • [topic] vs [competitor brand], [competitor brand] alternative
    • [topic] API, [topic] pricing, [topic] tutorial
  2. Run apify/google-search-scraper for each candidate query. For each result, extract:

    • aiOverview.sources[], aiMode.sources[], chatGptAnswer.sources[], perplexityAnswer.sources[], copilotAnswer.sources[], geminiAnswer.sources[]
    • Also check answer_text / aiOverview.text for competitor brand name mentions (word-boundary match: \bBrand\b)
  3. For each (query, source) pair where the competitor domain or brand appears: record a hit.

  4. Output a prompt-major table sorted by total hit count descending:

| Query | ChatGPT | Perplexity | AI Overviews | AI Mode | Copilot | Gemini | Total |
|-------|---------|------------|--------------|---------|---------|--------|-------|
| "best web scraping API" | ✓ | ✓ | — | ✓ | — | ✓ | 4 |
| "how to scrape Google" | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 6 |
  1. Deliver the top-N queries (default 10) as a ready-to-paste list for Workflow D's config.json prompts.

Workflow B — Citation Opportunity Finder

Goal: For a target topic, identify which domains and content types AI engines most often cite — revealing where to publish or pitch content.

Inputs to collect

#InputNotes
1Target topic / industrye.g. "web scraping", "ecommerce automation"
2Seed queries5–20 queries covering the topic space
3AI sourcesDefault: all six
4Deep-crawl top cited?Optional: crawl top-3 cited pages with website-content-crawler for structure patterns

Workflow

  1. Run apify/google-search-scraper for each seed query across selected AI sources.

  2. Collect every URL from sources[] across all results. Normalise to registrable domain (blog.example.comexample.com).

  3. Aggregate:

    • By domain: count citations, list which AI sources cite it, list which queries triggered it
    • By content type: infer from URL path patterns (docs → /docs/, /reference/; blog → /blog/; news → known news domains)
  4. Rank by total citation count. Output:

Top-cited domains for "web scraping" (42 queries × 6 sources):
| Domain | Citations | AI Sources | Inferred type |
|--------|-----------|------------|--------------|
| docs.apify.com | 38 | ChatGPT, Perplexity, AI Mode | Documentation |
| scraperapi.com/blog | 21 | AI Overviews, Gemini | Long-form blog |
  1. If deep-crawl enabled: run apify/website-content-crawler on the top-3 cited URLs per domain. From the markdown output, extract:

    • First heading that directly answers the query
    • Presence of code blocks in first 500 words
    • Word count
    • Whether an H2/H3 contains the exact query phrase
  2. Summarise patterns: "AI engines in this topic prefer [long-form docs / short direct-answer posts]. Typical cited page: [word count range], [has/lacks direct-answer H2], [has/lacks code example above the fold]."


Workflow C — GEO Website Audit

Goal: Check whether a specific website's content is structured for AI citation; compare it against what AI engines actually cite for your target prompts.

Inputs to collect

#InputNotes
1Your website URLe.g. https://apify.com
2Target promptsUse Workflow A output, or supply 5–10 directly
3AI sourcesDefault: all six

Workflow

  1. Run apify/google-search-scraper for each target prompt. For each (prompt × source) record whether your registrable domain appears in sources[].

  2. For prompts where your domain is not cited: identify the top-cited competitor URL for that prompt.

  3. Run apify/website-content-crawler on:

    • Your most relevant page(s) for each un-cited prompt
    • The top-cited competitor page for each un-cited prompt
  4. For each un-cited prompt, produce a gap card:

Prompt: "how to scrape Google search results"
Your page: apify.com/blog/scraping-google  →  NOT cited on ChatGPT, Perplexity, AI Mode
Top-cited: docs.brightdata.com/scraping/google (cited 5/6 sources)

Structural gaps:
  ✗ Your page: answer buried after 900 words, no direct-answer H2
  ✓ Competitor: H2 "How to scrape Google in 3 steps" at word 120 + code block at word 180

Recommended actions (priority order):
  1. Add H2 that mirrors the query phrase within first 300 words
  2. Move code example above the fold
  3. Add a "Quick answer" summary box at the top
  1. Deliver: per-prompt gap cards + a consolidated action table ranked by expected impact.

Workflow D — Recurring Visibility Tracker

Goal: Snapshot brand citations and mentions across all six AI surfaces on a recurring schedule and track changes over time.

Prerequisites

(No need to check upfront)

  • APIFY_TOKEN saved in a .env file next to config.json (the runner auto-loads it).
  • Python 3.9+ on PATH. pip3 install requests (only third-party dependency); pip3 install tldextract recommended for accurate registrable-domain matching on multi-part TLDs.
  • For automated daily runs: macOS / Linux with launchd or cron available (the installer handles both). Windows users get printed schtasks instructions.

Steps

Copy this checklist and track progress:

Task Progress:
- [ ] Step 1: Load or collect the seven required inputs
- [ ] Step 2: Confirm AI sources and cadence
- [ ] Step 3: Write config.json + .env, then install the OS schedule
- [ ] Step 4: Run a snapshot now so the user sees the first report
- [ ] Step 5: Deliver the history report (diff vs. all prior runs)

Step 1: Load or Collect the Seven Required Inputs

If config.json exists in the user's working directory, load it and skip to Step 4 unless the user asks to reconfigure. On first run, ask all seven anchors before any Actor call:

#InputWhy it matters
1Brand URLPrimary domain. Drives registrable-domain citation matching (blog.apify.com -> apify.com).
2Brand name(s)Surface forms for text-mention matching (e.g., Apify, apify.com, @apify). URL-only matching misses mentions without links.
3Competitor brandsAsk explicitly: "Which competitors do you want tracked alongside your brand?" Accept name + domain pairs. Zero is allowed; the question must still be asked on first run.
4Prompts to monitorOne or more search queries. Each runs through every enabled AI source. If you don't know which prompts to use yet, run Workflow A first — it discovers competitor-visible prompts you can paste here.
5Cadencedaily / weekly / monthly. Drives the schedule entry that install_cron.sh writes.
6Which AI sourcesPresent the six (AI Overviews, AI Mode, ChatGPT, Perplexity, Copilot, Gemini), all enabled by default. Each adds per-result cost -- current pricing on the Actor page (https://apify.com/apify/google-search-scraper).
7Apify Dataset nameThe named dataset to append to. If absent, created on first run; the name is recorded in config.json.

After those seven, ask optional follow-ups: countryCode, languageCode, location (UULE), preferred run hour (default 09:00 local).

Then one verbosity question -- save as config.json:include_full_answers:

  • on_demand (default): report shows short quoted snippets around each surface-form match. Full LLM answers live in the named KV store; user can ask later.
  • always: report embeds the full LLM answer verbatim whenever any entity is mentioned. Useful for one prompt; gets unwieldy at 5+ prompts.

Step 2: Confirm AI Sources and Cadence

Echo back the user's seven choices in a single paragraph for confirmation. If the user toggles sources, update the in-memory config before writing.

Step 3: Write config.json + .env, Then Install the OS Schedule

Create the working directory layout next to where the user wants reports to land:

working-dir/
  config.json     # copied from the skill's config.example.json, edited with collected values
  .env            # APIFY_TOKEN=apify_api_xxx   (chmod 600)
cp ${CLAUDE_PLUGIN_ROOT}/reference/scripts/config.example.json ./config.json
# then edit with the collected values, save

echo 'APIFY_TOKEN=your_token_here' > ./.env
chmod 600 ./.env

Then install the OS schedule:

bash ${CLAUDE_PLUGIN_ROOT}/reference/scripts/install_cron.sh --cadence daily --hour 9

Cron expression mapping:

CadenceCron expressionWhen
daily0 H * * *every day at H:00 local
weekly0 H * * 1every Monday at H:00
monthly0 H 1 * *the 1st of every month at H:00

Step 4: Run a Snapshot Now

macOS:

launchctl kickstart "gui/$(id -u)/com.apify.ai-visibility-tracker"
tail -f ~/Library/Logs/ai-visibility-tracker.log

Linux / generic:

python3 ${CLAUDE_PLUGIN_ROOT}/reference/scripts/run_snapshot.py --config ./config.json

Both paths:

  1. Call apify/google-search-scraper with the configured prompts + AI-source toggles.
  2. Parse each (prompt x source) cell for citations and brand/competitor mentions.
  3. Append rows to the named Apify Dataset (schema in reference/output-schema.md).
  4. Write the raw item to the named KV store (long-term archive).
  5. Compute the history vs. all prior runs.
  6. Write reports/snapshot-<ISO-date>.md next to config.json.

Step 5: Deliver the History Report

Open reports/snapshot-<ISO-date>.md and surface the top findings in chat. Lead with:

  • First-ever citations / mentions today -- entity x source combinations crossing the threshold for the first time.
  • Drops -- entity was cited in the latest prior run but isn't today.
  • For every cited entity, the exact matched URL(s).

Output format

Snapshot summaries are entity-major: one Markdown table per tracked entity (brand, then competitors), one row per AI source, columns Source | Cited | Mentioned | SoV% | Matched URLs | History.


Actors

ActorUsed inKey input fields
apify/google-search-scraperA, B, C, Dqueries[], aiOverview, chatGptSearch, perplexitySearch, googleAiMode, bingCopilotSearch, googleGeminiSearch
apify/website-content-crawlerB (optional), CstartUrls[], maxCrawlPages, outputMarkdown: true

Pricing changes; check the pricing tab before quoting numbers. Disable unused AI sources to reduce cost.

Telemetry. Workflow D runs through reference/scripts/run_snapshot.py, which already sets User-Agent: apify-awesome-skills/ai-search-visibility-tracker-... on every Apify API call. When calling these Actors ad-hoc in Workflows A-C, pass the matching flags so usage is attributed: --user-agent apify-awesome-skills/apify-ai-search-visibility-tracker and --json (use --format json for apify datasets get-items), and append 2>/dev/null. Example:

apify actors call apify/google-search-scraper \
  --user-agent apify-awesome-skills/apify-ai-search-visibility-tracker \
  --json 2>/dev/null

Quality Rules

  • Non-interactive. No stdin reads in run_snapshot.py -- launchd / cron has no stdin.
  • Word-boundary brand matching (\bbrand\b, case-insensitive). See reference/citation-matching.md.
  • Registrable-domain citation matching (blog.apify.com counts as apify.com). See reference/citation-matching.md.
  • Never skip a row. If an AI source returns nothing, write a row with cited: false, mentioned: false, answer_text: "[no answer returned]".
  • Every row carries the Apify run ID so any finding can be reverified.

Error Handling

APIFY_TOKEN not found -- Tell the user to put it in .env next to config.json (echo 'APIFY_TOKEN=...' > .env && chmod 600 .env). Token at https://console.apify.com/account/integrations. config.json not found -- Run Step 3 first to create it from the template. Dataset name not set -- Ask the user for a name; the runner will create the dataset on first append. Actor run FAILED -- Print the console link from the runner output and ask the user to inspect it. AI source returned no answer -- The row is still written with [no answer returned]. Not an error. website-content-crawler returns no markdown -- Page may be JS-heavy; try with useBrowserCrawler: true. Schedule not firing -- See reference/scheduling.md troubleshooting section. No previous run to diff against -- First run only. The report renders the snapshot without a history section.

apify의 다른 스킬

bug-triage
apify
apify/apify-mcp-server 저장소의 열린 버그 이슈를 분류합니다. 분석하고, 응답을 초안 작성하며, 승인을 받고, 게시합니다.
official
apify-influencer-brand-collabs
apify
인스타그램 브랜드-크리에이터 파트너십을 Apify 액터를 연결하여 발견하세요. 사용자가 브랜드와 협업하는 사람, 크리에이터가 유료로 진행한 브랜드 등을 물을 때 사용하세요.
official
dig
apify
Apify MCP 서버에서 작업을 탐색, 계획 및 사양을 정하는 유연한 스킬입니다. 소스 파일을 편집하지 마십시오 — 이 스킬은 이해와 계획 전용입니다.
official
apify-financial-news
apify
추적 중인 포트폴리오 기업에 대한 금융 뉴스를 33개의 검증된 티어 1 소스(블룸버그, 로이터, FT, WSJ, 인텔리뉴스, ČTK, PAP, BTA 등)에서 발견하고 추출합니다.
official
apify-actor-development
apify
서버리스 클라우드 프로그램을 생성, 디버깅 및 배포하여 웹 스크래핑, 자동화 및 데이터 처리를 수행합니다. JavaScript, TypeScript 및 Python 템플릿을 지원하며, HTTP 및 브라우저 기반 크롤링을 위한 통합 Crawlee, Playwright 및 Cheerio 라이브러리를 포함합니다. 격리된 스토리지와 함께 apify run을 통한 로컬 테스트, 입력/출력에 대한 스키마 검증, apify push를 통한 Apify 플랫폼 배포를 포함합니다. Apify CLI 인증 및 AI를 위한 .actor/actor.json의 필수 generatedBy 메타데이터가 필요합니다...
official
apify-actorization
apify
기존 프로젝트를 언어별 SDK 통합을 통해 서버리스 Apify Actor로 변환합니다. JavaScript/TypeScript(Actor.init() / Actor.exit() 사용), Python(비동기 컨텍스트 매니저), CLI 래퍼를 통한 모든 언어를 지원합니다. 구조화된 워크플로우를 제공합니다: apify init으로 스캐폴딩, SDK 래핑 적용, 입출력 스키마 구성, apify run으로 로컬 테스트, apify push로 배포. 입출력 스키마 검증, Docker 컨테이너화, 선택적 이벤트당 과금을 포함합니다.
official
apify-generate-output-schema
apify
Apify Actor의 소스 코드를 분석하여 출력 스키마(dataset_schema.json, output_schema.json, key_value_store_schema.json)를 생성합니다. 다음과 같은 경우에 사용하세요…
official
apify-ultimate-scraper
apify
Instagram, TikTok, YouTube, Facebook, Google Maps 등 55개 이상의 플랫폼에 최적의 Actor를 선택하는 자동화된 웹 스크래퍼. 8개 주요 플랫폼에 걸쳐 55개 이상의 사전 구성된 Actor를 포함하며, 사용 사례별 선택 가이드(리드 생성, 인플루언서 발굴, 브랜드 모니터링, 경쟁사 분석, 트렌드 조사)를 제공합니다. 빠른 채팅 표시, CSV 내보내기, 또는 사용자 정의 가능한 결과 제한이 있는 JSON 내보내기의 세 가지 출력 형식을 지원합니다. 복잡한 작업을 위한 다중 Actor 워크플로 패턴을 포함합니다...
official