# Website SEO Audit & Site Audit + AEO/GEO Checker: 0-100 (`cygnix_labs/site-seo-aeo-audit`) Actor

SEO audit + site audit crawler with an AEO/GEO (AI search) score. One URL in: every page and the site scored 0-100 for technical SEO, broken internal links, schema, llms.txt, GPTBot/ClaudeBot access and answerability. Fix plan + client report. 10 pages free, then $0.015/page.

- **URL**: https://apify.com/cygnix_labs/site-seo-aeo-audit.md
- **Developed by:** [Umair Saleem Mohammad Saleem](https://apify.com/cygnix_labs) (community)
- **Categories:** SEO tools, AI, Agents
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$15.00 / 1,000 page auditeds

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

## Website SEO Audit & Site Audit + AEO/GEO Checker: 0-100

**Answer first:** this actor is an **SEO audit and site audit crawler with an AEO / GEO (AI search) score built in**. Give it one URL. It crawls the site and scores **every page and the whole site from 0 to 100** for technical SEO (titles, meta, canonicals, indexability, **broken internal links**, **schema / JSON-LD**) **and** AI search readiness (**llms.txt**, GPTBot / ClaudeBot / PerplexityBot access, answer-first passages, freshness). You get each issue with a fix, a P1/P2/P3 fix plan and a client-ready Markdown report. **The first 10 pages of every run are free, then $0.015 per page.**

| Quick facts | |
|---|---|
| Best for | SEO audit, site audit, technical SEO audit, AEO audit, GEO audit, llms.txt check, AI crawler robots.txt check, client SEO reports |
| Input | One start URL (plus optional page cap and URL filters) |
| Output | One row per page (score, 6 category scores, issues + fixes) and one site summary (site score, fix plan, broken links, AI crawler table) + Markdown report |
| Price | First 10 pages free every run, then $0.015 per audited page. No start fee. Broken, noindex and robots-blocked URLs are never billed |
| Needs | No API keys, no proxies, no login |
| Not included | JavaScript rendering, Core Web Vitals, backlinks, rankings |

**Try it now:** the input is prefilled with `https://plausible.io` and 10 pages, so the first run is free. Swap in your own URL.

### What you get

Two record types in the dataset (plus two files in the key-value store):

| Output | What it is |
|---|---|
| `page` records | One per audited page: overall score, 6 category scores, critical/warning counts, top 5 fixes, the full issue list (id, severity, category, message, fix) and the raw measurements behind each score |
| `site-summary` record | Site score, category averages, P1/P2/P3 fix plan, top issues ranked by severity and pages hit, score distribution, 10 lowest-scoring pages, duplicate titles and descriptions, broken internal URLs, AI crawler access table |
| `SUMMARY` (key-value store) | Same site summary as JSON, handy for APIs and agents |
| `REPORT` (key-value store) | A Markdown client report: score table, findings, fix plan, lowest pages, method. Paste it into Google Docs or Notion |

### The 6 categories (and their weight in the score)

| Category | Weight | What is checked |
|---|---|---|
| **AI crawler access + llms.txt** | 20% | Is the page allowed for GPTBot, OAI-SearchBot, ChatGPT-User, ClaudeBot, PerplexityBot and Google-Extended in robots.txt? Is there a `/llms.txt`? Is a sitemap declared in robots.txt? |
| **Answerability (AEO)** | 25% | One H1, a 50-160 character meta description, question-style H2/H3, **answer-first passages** (40-170 words right under a heading, the length AI engines lift), lists/tables, enough server-rendered text, author or organisation signals, FAQ blocks |
| **Structured data + entity** | 20% | JSON-LD present and parseable, required properties for 19 common types (Article, Product, Offer, FAQPage, HowTo, Organization, LocalBusiness, BreadcrumbList, Review, Event...), placeholder text, Organization/Person entity, BreadcrumbList on inner pages, microdata detection |
| **Freshness** | 15% | Newest credible date from `<time>`, meta tags, visible "Updated" text and JSON-LD dateModified, checked against sitemap `lastmod`. FRESH (≤30 days), WARN (31-90), STALE (90+), MISSING_DATE, SITEMAP_MISMATCH. The site score also flags "deploy-stamped" dates shared by most pages |
| **Share preview** | 10% | og:title, og:description, absolute og:image, twitter:card, og:url, og:type, truncation risk, title drift |
| **Technical basics** | 10% | Absolute canonical, `<html lang>`, viewport, indexable (meta robots and X-Robots-Tag), title present and length, HTTPS, broken internal URLs |

Bands: **80-100 STRONG · 65-79 GOOD · 50-64 FAIR · 35-49 POOR · 0-34 CRITICAL**. A page loses points only for things actually found on it, so the score moves when you fix them.

### Input

```json
{
  "startUrl": "https://plausible.io",
  "maxPages": 10,
  "maxConcurrency": 5,
  "respectRobotsTxt": true,
  "useSitemap": true,
  "skipNoindexPages": true,
  "includeSubdomains": false,
  "excludeUrlPatterns": ["/tag/", "/author/"]
}
```

| Field | Default | What it does |
|---|---|---|
| `startUrl` (required) | | Homepage or any page. Redirects are followed (www to non-www etc.) |
| `maxPages` | 20 | Pages audited and your cost cap. 10 = free preview, 50 = standard audit, 500+ = full site |
| `maxConcurrency` | 5 | Parallel requests. Drops to 1 automatically if robots.txt sets a Crawl-delay |
| `respectRobotsTxt` | true | Skips disallowed URLs and honours Crawl-delay |
| `useSitemap` | true | Pages found through links go first, then sitemap URLs fill the rest. Sitemap `lastmod` feeds the freshness check |
| `skipNoindexPages` | true | Login, cart and thank-you pages marked noindex are listed but **not audited and not billed** |
| `includeSubdomains` | false | Also crawl blog.example.com etc. |
| `excludeUrlPatterns` | \[] | Substrings, or a regex wrapped in slashes |

### Sample output (real run on plausible.io, 18 Oct 2026, 50 pages)

This is an unedited run of the current build: `{"startUrl": "https://plausible.io", "maxPages": 50}`. It took under 4 seconds and cost **$0.60** (10 free pages + 40 billed). 290 URLs were discovered, 4 noindex pages (login, register) were skipped for free and 0 URLs were broken.

**Site score: 78/100 GOOD** · AI crawler access 80 · Answerability 77 · Schema 70 · Freshness 70 · Share preview 83 · Technical 100 · 30 pages STRONG, 20 GOOD.

**Page scores view** (the default dataset table, 6 of 50 rows):

| Page | Score | AI crawler access | Answerability | Schema | Freshness | Share preview | Technical | First fix |
|---|---|---|---|---|---|---|---|---|
| plausible.io/ | 74 GOOD | 80 | 80 | 85 | 20 | 80 | 100 | Add Organization JSON-LD with name, url, logo and sameAs links to official profiles |
| plausible.io/docs | 82 STRONG | 80 | 65 | 85 | 100 | 80 | 100 | Open each H2 with a self-contained 40-170 word answer before the details |
| plausible.io/docs/website-settings | 73 GOOD | 80 | 65 | 85 | 40 | 80 | 100 | Open each H2 with a self-contained 40-170 word answer before the details |
| plausible.io/docs/change-plan | 73 GOOD | 80 | 60 | 85 | 40 | 90 | 100 | Open each H2 with a self-contained 40-170 word answer before the details |
| plausible.io/docs/consolidated-views | 78 GOOD | 80 | 80 | 85 | 40 | 90 | 100 | Add a named author (articles) or Organization schema (site-wide) |
| plausible.io/docs/google-analytics-import | 90 STRONG | 80 | 90 | 85 | 100 | 90 | 100 | Add a named author (articles) or Organization schema (site-wide) |

**What the site summary told plausible.io to fix first:**

1. P1 · Publish /llms.txt (the site returns 404 for it; GPTBot, ClaudeBot, PerplexityBot and the other major AI crawlers are all allowed)
2. P1 · Add Organization JSON-LD to the homepage (no Organization entity, no sameAs)
3. P2 · Write answer-first passages on 14 docs pages
4. P2 · Add a date to the homepage (no visible, meta, JSON-LD or sitemap date)
5. P3 · Review 18 docs pages last dated more than 90 days ago

Site summary record (shortened):

```json
{
  "type": "site-summary",
  "site": "plausible.io",
  "siteScore": 78,
  "band": "GOOD",
  "pagesAudited": 50,
  "freePages": 10,
  "billedPages": 40,
  "categoryScores": { "crawlerAccess": 80, "answerability": 77, "structuredData": 70, "freshness": 70, "sharePreview": 83, "technical": 100 },
  "categoryNotes": {
    "crawlerAccess": ["all 6 major AI crawlers allowed at /", "no /llms.txt", "Sitemap: declared in robots.txt"],
    "structuredData": ["JSON-LD on 50/50 pages", "types: Answer, BreadcrumbList, FAQPage, ListItem, Question, WebSite", "0 invalid block(s) of 125"],
    "freshness": ["MISSING_DATE=1 · FRESH=20 · WARN=11 · STALE=18"]
  },
  "fixPlan": [
    { "priority": "P1", "category": "crawlerAccess", "fix": "Publish /llms.txt", "how": "A plain-text index of your top 10-20 pages with one-line summaries, served at /llms.txt" },
    { "priority": "P1", "category": "structuredData", "fix": "Add Organization JSON-LD to the homepage", "how": "name, url, logo, sameAs (official profiles), contactPoint; only facts you can verify" },
    { "priority": "P2", "category": "answerability", "fix": "Write answer-first passages on 14 page(s)", "how": "Open each H2 with a 40-170 word self-contained answer" },
    { "priority": "P3", "category": "freshness", "fix": "Review 18 stale page(s)", "how": "Refresh evergreen guides that still get traffic" }
  ],
  "topIssues": [
    { "id": "FEW_ANSWER_PASSAGES", "severity": "warning", "issue": "Fewer than 2 answer-first passages (40-170 words) under headings", "count": 14 },
    { "id": "NO_ORGANIZATION_ENTITY", "severity": "warning", "issue": "Homepage has no Organization/Person entity", "count": 1 }
  ],
  "scoreDistribution": { "strong": 30, "good": 20, "fair": 0, "poor": 0, "critical": 0 },
  "brokenPages": [],
  "aiCrawlerAccess": { "robotsTxt": "found", "llmsTxt": false, "sitemapUrls": 165,
    "bots": { "GPTBot": "allowed", "OAI-SearchBot": "allowed", "ChatGPT-User": "allowed", "ClaudeBot": "allowed", "PerplexityBot": "allowed", "Google-Extended": "allowed" } },
  "crawl": { "respectRobotsTxt": true, "skippedByRobots": 0, "noindexSkippedFree": 4, "urlsDiscovered": 290, "avgResponseMs": 15 }
}
```

One page record, the homepage (shortened):

```json
{
  "type": "page",
  "url": "https://plausible.io/",
  "httpStatus": 200,
  "title": "Plausible Analytics | Simple, privacy-friendly Google Analytics alternative",
  "score": 74,
  "band": "GOOD",
  "crawlerAccess": 80, "answerability": 80, "structuredData": 85, "freshness": 20, "sharePreview": 80, "technical": 100,
  "criticalCount": 0,
  "warningCount": 2,
  "topFixes": [
    "Add Organization JSON-LD with name, url, logo and sameAs links to official profiles.",
    "Show a visible \"Updated\" date and add JSON-LD dateModified + sitemap lastmod on the same day."
  ],
  "issues": [
    { "severity": "warning", "category": "structuredData", "id": "NO_ORGANIZATION_ENTITY", "message": "Homepage has no Organization/Person entity", "fix": "Add Organization JSON-LD with name, url, logo and sameAs links to official profiles." },
    { "severity": "warning", "category": "freshness", "id": "MISSING_DATE", "message": "No visible Updated date, <time>, meta or JSON-LD date", "fix": "Show a visible \"Updated\" date and add JSON-LD dateModified + sitemap lastmod on the same day." },
    { "severity": "info", "category": "technical", "id": "TITLE_LENGTH", "message": "Title is 75 characters (aim for 15-60)", "fix": "Keep titles 15-60 characters so they do not truncate." },
    { "severity": "info", "category": "sharePreview", "id": "SHARE_WARNING", "message": "og:title differs from <title> (share drift)", "fix": "Trim titles to 60 and descriptions to 160 characters; add og:url/og:type." }
  ],
  "details": { "h1Count": 1, "questionHeadings": 2, "answerPassages": 4, "wordCount": 1386, "listsAndTables": 11, "faqBlock": false,
    "schemaTypes": ["WebSite"], "sameAs": false, "freshness": { "status": "MISSING_DATE", "bestDate": null },
    "sharePreview": { "status": "WARN", "ogTitle": "Plausible Analytics", "twitterCard": "summary_large_image" }, "indexable": true, "aiBotsBlocked": [] },
  "crawlDepth": 0,
  "foundVia": "start URL",
  "responseTimeMs": 81
}
```

The `REPORT` file from the same run starts like this:

```markdown
## SEO + AI Search Readiness Report: plausible.io

Date: 2026-10-18 · Pages audited: 50 · Start URL: https://plausible.io/

### What a run costs

You pay only for pages actually audited. **The first 10 pages of every run are free.** Broken URLs, noindex pages, robots-blocked URLs and files (images, PDFs, feeds) are never billed. There is no start fee.

| Pages audited | You pay |
|---|---|
| 10 | **$0** (free in every run) |
| 25 | $0.23 |
| 50 | $0.60 |
| 100 | $1.35 |
| 500 | $7.35 |
| 1,000 | $14.85 |

Set **Maximum cost per run** in the run options and the crawl stops cleanly when it is reached. The actor runs on 512 MB with plain HTTP (no headless browser), so runs are fast: our 100-page test runs finished in under 15 seconds of compute.

### How it compares (live Apify Store prices, verified 18 Oct 2026)

List prices on the Apify Free plan, read from the Apify Store API on 18 October 2026. Some actors charge less on higher Apify plans.

| Actor | Price per page | Free pages | Cost for 100 pages | AI search (AEO/GEO) checks | Main strength |
|---|---|---|---|---|---|
| **cygnix_labs/site-seo-aeo-audit** (this) | **$0.015** | **10 every run** | **$1.35** | Yes: llms.txt, 6 AI crawlers per URL, answer passages, freshness | SEO + AEO in one weighted 0-100 score, site fix plan, Markdown client report |
| smart-digital/complete-seo-audit-tool | $0.04 | No | $4.00 | Mostly no | Most used (750 users), browser crawl, Core Web Vitals, accessibility |
| acebuilds/seo-audit-crawler | $0.03 | No | $3.00 | No | Real-user Core Web Vitals (INP), JS rendering |
| logiover/website-seo-audit-crawler | $0.015 per result (+ tiny start fee) | No | ~$1.50 | No | On-page analyzer, CSV export |
| dltik/geo-site-audit | $0.01 (+ tiny start fee) | No | ~$1.00 | Yes | GEO / AI readiness only, no full SEO crawl |
| lindenwerk/seo-audit-crawler | $0.008 + $0.01 per site summary | No | ~$0.81 | Yes: AI bots, llms.txt | Bulk site lists, broken + external links |
| tidytools/seo-audit-crawler | $0.005 | No (broken pages free) | $0.50 | No | Cheapest per page, browser fallback for blocked sites |
| fayoussef/seo-geo-aeo-audit | $0.0045 per result | No | ~$0.45 | Yes | Separate SEO / GEO / AEO scores, HTML report |

**Honest take.** We are not the cheapest per page: tidytools, fayoussef and lindenwerk cost less on large crawls. Pick this one when you want **classic SEO and AI search readiness weighted into one score**, a **site-level P1/P2/P3 fix plan** and a **report you can hand to a client**, with small audits (up to 10 pages) free every time. If you need Core Web Vitals, JavaScript rendering or accessibility checks, use smart-digital or acebuilds instead; this actor reads server HTML only.

### For AI agents / MCP

**When an agent should call this actor:** the user asks for an SEO audit, site audit, technical SEO check, AEO audit, GEO audit, "is my site ready for ChatGPT / AI search", an llms.txt check, or a list of broken internal links for one website.

Connect the Apify MCP server with only this actor enabled (works in Claude, ChatGPT, Cursor, VS Code, Codex and any MCP client):
```

https://mcp.apify.com?tools=cygnix_labs/site-seo-aeo-audit

````
Or search for it with the default server: `search-actors` keywords such as `SEO audit`, `site audit`, `AEO audit`, `GEO audit`, `llms.txt`.

Example `call-actor` input:
```json
{
  "startUrl": "https://example.com",
  "maxPages": 30,
  "respectRobotsTxt": true,
  "useSitemap": true
}
````

**What to read from the result:** the dataset row with `"type": "site-summary"` holds `siteScore`, `band`, `categoryScores`, `fixPlan` (priority, fix, how), `topIssues`, `brokenPages` and `aiCrawlerAccess`. Page rows (`"type": "page"`) hold `url`, `score`, `topFixes` and `issues`. The key-value store has `SUMMARY` (JSON) and `REPORT` (Markdown) you can return to the user as is.

**Cost control for agents:** Keep `maxPages` at 10 for a free first pass; 30-50 pages covers most small sites for under $0.60. Pass `maxTotalChargeUsd` in `callOptions` to hard-cap spend. This actor is pay-per-event, so it also works with Apify agentic payments (no Apify account needed for the agent).

Example prompt: *"Run an SEO and AI search audit on example.com, 30 pages, and give me the top 5 fixes with the pages they affect."*

### FAQ

**Does it render JavaScript?** No. It reads the HTML the server sends, which is exactly what GPTBot, ClaudeBot, PerplexityBot and most AI crawlers read. If a page scores low on "server-rendered text", that is a real finding: AI engines probably cannot see that content either.

**Will a high score get me cited by ChatGPT or rank on Google?** Nobody can promise that, and we don't. The score measures readiness: whether AI engines and search engines are allowed in, can extract clean answers and can trust what they find. It does not measure rankings, traffic or citations.

**Does it respect robots.txt?** Yes, by default. Disallowed URLs are skipped (and counted in `crawl.skippedByRobots`), and a Crawl-delay drops the crawl to one request at a time. Our user-agent is `CygnixSiteAudit`.

**How do I keep cost under control?** `maxPages` is a hard cap, and you can set a maximum cost per run. A 10-page run is always free, so try it on your own site first.

**Why is a page missing from the results?** It was noindex (see `crawl.noindexPages`), blocked by robots.txt, not HTML, broken (see `brokenPages`) or beyond `maxPages`. Links are followed breadth-first from the start URL, then sitemap URLs fill the remaining budget.

**Can I audit several sites?** One site per run keeps the summary clean. Use the API or a Task per site, or schedule monthly runs and compare scores.

**Sites behind login or heavy anti-bot?** Out of scope. No proxies are used.

**Is this an SEO audit or an AEO / GEO audit?** Both in one crawl. Three of the six categories are classic SEO (technical basics, structured data, share preview); three are AI search readiness (AI crawler access + llms.txt, answerability, freshness). Each page gets one combined 0-100 score and all six sub-scores, so you can read it either way.

**Does it find broken links?** It finds **broken internal URLs** (4xx/5xx and failed fetches) discovered during the crawl and lists them in `brokenPages` with the status code and the page that linked to them (`linkedFrom`). External links are not checked.

**Does it check llms.txt?** Yes. It requests `/llms.txt` once per site and reports whether it exists (an HTML soft-404 does not count). The fix plan tells you to publish one if it is missing.

### Integrations

Run it through the Apify API, schedule it monthly, or send results to Google Sheets, Make, Zapier, n8n, Slack or a webhook.

### Changelog

- **0.1.6** (2026-10-18): README and Store text rewritten answer-first for search and AI agents: SEO audit / site audit / AEO / GEO terms, quick facts, comparison re-verified against 8 named actors on 18 Oct 2026, "For AI agents / MCP" section with example input, more FAQ. Price unchanged ($0.015/page, first 10 free).
- **0.1.5** (2026-10-18): Real 50-page sample run on plausible.io, price set to $0.015/page.

### More SEO and AEO tools by Cygnix Labs

- [AEO & GEO Audit + llms.txt Checker (URL list)](https://apify.com/cygnix_labs/aeo-readiness-checker)
- [Internal Link Audit & Orphan Page Finder](https://apify.com/cygnix_labs/internal-link-audit)
- [Content Decay Audit (Search Console)](https://apify.com/cygnix_labs/content-decay-audit)
- [Keyword Cannibalization Checker (Search Console)](https://apify.com/cygnix_labs/keyword-cannibalization-finder)
- [Keyword Clustering + Content Briefs](https://apify.com/cygnix_labs/keyword-clusterer-brief)
- [Search Intent Classifier](https://apify.com/cygnix_labs/serp-intent-mapper)
- Free local SEO MCP server: [cygnix-seo-mcp](https://github.com/cygnixlabs-cmd/cygnix-seo-mcp) (`npx -y cygnix-seo-mcp`)

Questions or a feature request? Open an issue on this actor's Issues tab. We answer within 24 hours.

# Actor input Schema

## `startUrl` (type: `string`):

Homepage or any page of the site to audit, e.g. https://plausible.io. The crawler follows internal links (and the sitemap) on the same domain.

## `maxPages` (type: `integer`):

Pages audited. The first 10 pages of every run are free, then you pay per page audited. 10 = free preview, 50 = standard audit, 500+ = full site.

## `maxConcurrency` (type: `integer`):

Pages fetched in parallel. Lower it for small or slow servers.

## `respectRobotsTxt` (type: `boolean`):

Skip URLs that robots.txt disallows and honour Crawl-delay. Keep on for polite crawling.

## `useSitemap` (type: `boolean`):

Add sitemap URLs to the queue (after the pages found through links) and use lastmod for the freshness check.

## `skipNoindexPages` (type: `boolean`):

Pages marked noindex (login, cart, thank-you pages) are listed in the summary but not audited, not counted toward Max pages and not billed. Turn off to audit them too.

## `includeSubdomains` (type: `boolean`):

Also crawl subdomains, e.g. blog.example.com when starting from example.com.

## `excludeUrlPatterns` (type: `array`):

Substrings to skip (e.g. /tag/, /author/, ?page=). Wrap in slashes for a regex. Files (images, PDFs, feeds) are never crawled or billed.

## Actor input object example

```json
{
  "startUrl": "https://plausible.io",
  "maxPages": 10,
  "maxConcurrency": 5,
  "respectRobotsTxt": true,
  "useSitemap": true,
  "skipNoindexPages": true,
  "includeSubdomains": false,
  "excludeUrlPatterns": []
}
```

# Actor output Schema

## `results` (type: `string`):

No description

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

No description

## `report` (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 = {
    "startUrl": "https://plausible.io",
    "maxPages": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("cygnix_labs/site-seo-aeo-audit").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 = {
    "startUrl": "https://plausible.io",
    "maxPages": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("cygnix_labs/site-seo-aeo-audit").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 '{
  "startUrl": "https://plausible.io",
  "maxPages": 10
}' |
apify call cygnix_labs/site-seo-aeo-audit --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cygnix_labs/site-seo-aeo-audit"
        }
    }
}
```

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/IwoKpvKxGQAd0hRZH/builds/qIlFybC8Wl6N1kGqE/openapi.json
