# WebCheck - Website Health Analyzer (`yifan897645/webcheck`) Actor

All-in-one website health check: SEO, accessibility, performance, security, and broken link detection. Analyze any URL in seconds.

- **URL**: https://apify.com/yifan897645/webcheck.md
- **Developed by:** [凡凡](https://apify.com/yifan897645) (community)
- **Categories:** SEO tools, Developer tools, MCP servers
- **Stats:** 6 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Website Audit Tool for Agencies & Freelancers

You're a web agency. A potential client asks you to audit their site. Instead of spending 2 hours manually checking SEO, broken links, accessibility, and security headers, run WebCheck and get a professional audit report in seconds.

Paste any URL, pick your audit modules, and get back structured findings with scores, prioritized issues, and actionable fix recommendations -- ready to drop into a proposal or client report.

### How agencies use WebCheck

#### 1. Prospect auditing (lead generation)

You found a local business with a bad website. Run a quick WebCheck audit on their homepage and top 3 pages. In 30 seconds you have a concrete list of problems: missing meta descriptions, broken links, no HTTPS, accessibility failures. Send them a short email: "I found 12 issues on your site -- here are the top 3 costing you traffic. Want me to fix them?" You just turned a cold lead into a warm conversation.

#### 2. Sales call preparation

A prospect booked a discovery call. Before the call, run WebCheck on their site and their top competitor's site. Show up with a side-by-side comparison: "Your SEO score is 54, your competitor scores 81. Here's exactly why." You're no longer pitching -- you're diagnosing. Clients close faster when you show them specific problems with data behind them.

#### 3. Client deliverables and ongoing monitoring

You closed the deal. Now schedule WebCheck to run weekly on the client's site. Use the detailed report format to generate structured audit data for your monthly reports. Track scores over time to prove ROI: "When we started, your SEO score was 54. After our work, it's 78. Here are the remaining items for next month." Retention goes up when clients see measurable improvement.

### What WebCheck audits

WebCheck runs up to four independent audit modules on each URL:

1. **Full Analysis** -- SEO score, response time rating, security header check (HSTS, CSP, X-Frame-Options), image alt-text audit, and content quality assessment. The all-in-one overview for prospect reports.

2. **SEO Audit** -- Title and meta description length validation, heading hierarchy, word count, Open Graph and Twitter Card tags, structured data (JSON-LD), canonical URL, robots meta, and language attribute. The detail you need for SEO proposals.

3. **Accessibility Check** -- Image alt attributes, heading level skips, form label associations, ARIA landmarks, skip-to-content links, and language declaration. Essential for ADA/WCAG compliance services.

4. **Broken Link Finder** -- Crawls every link on the page (up to your configured limit), checks each one in parallel, and reports 404s, timeouts, and redirects. Nothing kills credibility like broken links -- and clients rarely know they have them.

Each audit returns a 0-100 score, a list of issues ranked by severity, and concrete suggestions for fixing them.

### Why agencies choose WebCheck

- **No setup, no overhead.** Paste a URL, hit Start. No API keys, no browser extensions, no accounts to configure. Bill your time on strategy, not tooling.
- **Batch processing.** Audit an entire client site or a list of prospects in one run. Pass 10 URLs and get 10 structured reports back.
- **Two report formats.** Use "summary" for quick prospect scans during outreach. Use "detailed" for full client deliverables with fix instructions.
- **Structured JSON output.** Every result is machine-readable. Feed it into your reporting dashboard, Google Sheets, or CRM pipeline.
- **Lightweight and fast.** Pure HTTP-based analysis with parallel link checking. Audits complete in seconds, not minutes.
- **White-label ready.** The output is raw data -- no branding, no watermarks. Present it however you want in your own reports and proposals.

### Input parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `urls` | array of strings | Yes | -- | Client or prospect URLs to audit. Each URL is processed independently. |
| `checks` | array of strings | No | `["full", "seo", "accessibility", "links"]` | Which audit modules to run. Options: `full`, `seo`, `accessibility`, `links`. |
| `maxLinksPerPage` | integer | No | `50` | Maximum links to verify per page during broken link audit. Use 50 for prospect scans, 150+ for full client reports. |
| `reportFormat` | string | No | `"summary"` | `"summary"` for quick prospect audits (key issues only) or `"detailed"` for full client reports (every finding with fix instructions). |

#### Example: Quick prospect audit

```json
{
    "urls": [
        "https://prospect-business.com",
        "https://prospect-business.com/about"
    ],
    "checks": ["full", "seo"],
    "reportFormat": "summary"
}
````

#### Example: Full client site audit

```json
{
    "urls": [
        "https://client-site.com",
        "https://client-site.com/services",
        "https://client-site.com/contact",
        "https://client-site.com/blog"
    ],
    "checks": ["full", "seo", "accessibility", "links"],
    "maxLinksPerPage": 150,
    "reportFormat": "detailed"
}
```

### Sample output

Each URL produces one result object in the dataset. Here is a trimmed example from a full analysis:

```json
{
    "url": "https://example.com",
    "timestamp": "2026-03-31T12:00:00.000Z",
    "fullAnalysis": {
        "performance": {
            "responseTimeMs": 320,
            "contentLengthBytes": 48250,
            "rating": "fast"
        },
        "security": {
            "isHttps": true,
            "hasHsts": true,
            "hasContentSecurityPolicy": false,
            "hasXFrameOptions": true
        },
        "seo": {
            "score": 72,
            "title": "Example Site - Home",
            "titleLength": 19,
            "metaDescription": null,
            "hasViewport": true,
            "hasCanonical": false,
            "hasStructuredData": false,
            "wordCount": 450,
            "issues": [
                "Missing meta description",
                "Title too short (19 chars, recommend 50-60)",
                "2 image(s) missing alt text"
            ],
            "suggestions": [
                "Add a canonical URL to prevent duplicate content issues",
                "Add structured data (JSON-LD) for rich search results",
                "Add Open Graph tags for better social media sharing"
            ]
        },
        "images": {
            "total": 8,
            "missingAlt": 2
        }
    },
    "seo": {
        "score": 68,
        "title": { "value": "Example Site - Home", "length": 19, "status": "too_short" },
        "metaDescription": { "value": null, "length": 0, "status": "missing" },
        "headings": { "hasH1": true, "h1Count": 1, "hierarchyValid": true },
        "content": { "wordCount": 450, "status": "good" },
        "technical": {
            "viewport": true,
            "canonical": null,
            "structuredData": false
        },
        "social": {
            "hasOgImage": false,
            "twitterCard": null
        },
        "priorities": [
            "HIGH: Add a meta description (150-160 characters)",
            "CRITICAL: Switch to HTTPS"
        ],
        "issues": [
            "Title is shorter than recommended (aim for 50-60 chars)",
            "No canonical URL set",
            "No structured data (JSON-LD) found",
            "Missing og:title"
        ]
    },
    "brokenLinks": {
        "totalLinks": 45,
        "checked": 45,
        "broken": [
            { "url": "https://example.com/old-page", "status": 404 }
        ],
        "redirects": [
            { "url": "http://example.com/about", "redirectsTo": "https://example.com/about" }
        ],
        "healthy": 43,
        "summary": "Found 1 broken link(s) out of 45 checked."
    }
}
```

### Pricing

WebCheck uses **pay-per-event pricing**. You are charged for each URL audited. No flat monthly fee -- you pay only for what you use.

Running all four audit modules on a single URL counts as one event. Processing 10 URLs counts as 10 events. Check the pricing tab for the current per-event rate.

**Cost optimization for high-volume prospecting:**

- For initial prospect scans, use `reportFormat: "summary"` and only run `["full", "seo"]` checks.
- Save the full four-module detailed audit for clients you've already qualified.
- Keep `maxLinksPerPage` at 50 for prospect audits; increase for client deliverables.

### Integrations

WebCheck output is structured JSON, making it easy to plug into your existing agency workflow:

- **Apify API and client libraries** -- pull audit results programmatically in Python, JavaScript, or any language. Build custom reporting dashboards.
- **Scheduled runs** -- set up recurring weekly or monthly audits for client sites. Catch regressions automatically.
- **Webhooks** -- get notified when an audit completes and trigger your reporting pipeline.
- **Google Sheets / Excel** -- export results directly from the Apify console into client-ready spreadsheets.
- **Zapier / Make** -- connect WebCheck to your CRM: audit a prospect's site automatically when they enter your pipeline.

### Also available as an MCP server

If you use AI coding assistants (Claude, Cursor, Windsurf), WebCheck is also available as an MCP server that gives your AI assistant direct access to website audit tools:

```bash
npx webcheck-mcp
```

See the [webcheck-mcp npm package](https://www.npmjs.com/package/webcheck-mcp) for details.

# Actor input Schema

## `urls` (type: `array`):

Paste your prospect or client website URLs. Each URL gets a full audit you can use in proposals, reports, or sales calls.

## `checks` (type: `array`):

Choose which audits to run. Use all four for a comprehensive client report, or pick specific ones for a quick prospect scan.

## `maxLinksPerPage` (type: `integer`):

How many links to verify per page during the broken link audit. Higher = more thorough report, but takes longer. Default of 50 is good for prospect audits; use 150+ for full client deliverables.

## `reportFormat` (type: `string`):

Choose 'summary' for a quick prospect audit (key issues only, great for sales calls) or 'detailed' for a full client report (every finding with fix instructions, great for deliverables).

## Actor input object example

```json
{
  "urls": [
    "https://example.com"
  ],
  "checks": [
    "full",
    "seo",
    "accessibility",
    "links"
  ],
  "maxLinksPerPage": 50,
  "reportFormat": "summary"
}
```

# 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 = {
    "urls": [
        "https://example.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("yifan897645/webcheck").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 = { "urls": ["https://example.com"] }

# Run the Actor and wait for it to finish
run = client.actor("yifan897645/webcheck").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "urls": [
    "https://example.com"
  ]
}' |
apify call yifan897645/webcheck --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=yifan897645/webcheck",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "WebCheck - Website Health Analyzer",
        "description": "All-in-one website health check: SEO, accessibility, performance, security, and broken link detection. Analyze any URL in seconds.",
        "version": "0.1",
        "x-build-id": "ppfEh7ba5mUKasUzz"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/yifan897645~webcheck/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-yifan897645-webcheck",
                "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/yifan897645~webcheck/runs": {
            "post": {
                "operationId": "runs-sync-yifan897645-webcheck",
                "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/yifan897645~webcheck/run-sync": {
            "post": {
                "operationId": "run-sync-yifan897645-webcheck",
                "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": [
                    "urls"
                ],
                "properties": {
                    "urls": {
                        "title": "Client URLs to audit",
                        "type": "array",
                        "description": "Paste your prospect or client website URLs. Each URL gets a full audit you can use in proposals, reports, or sales calls.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "checks": {
                        "title": "Audit modules",
                        "type": "array",
                        "description": "Choose which audits to run. Use all four for a comprehensive client report, or pick specific ones for a quick prospect scan.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "full",
                                "seo",
                                "accessibility",
                                "links"
                            ],
                            "enumTitles": [
                                "Full Analysis (SEO + Security + Performance)",
                                "Detailed SEO Audit",
                                "Accessibility Check",
                                "Broken Link Finder"
                            ]
                        },
                        "default": [
                            "full",
                            "seo",
                            "accessibility",
                            "links"
                        ]
                    },
                    "maxLinksPerPage": {
                        "title": "Max links to check per page",
                        "minimum": 1,
                        "maximum": 200,
                        "type": "integer",
                        "description": "How many links to verify per page during the broken link audit. Higher = more thorough report, but takes longer. Default of 50 is good for prospect audits; use 150+ for full client deliverables.",
                        "default": 50
                    },
                    "reportFormat": {
                        "title": "Report format",
                        "enum": [
                            "summary",
                            "detailed"
                        ],
                        "type": "string",
                        "description": "Choose 'summary' for a quick prospect audit (key issues only, great for sales calls) or 'detailed' for a full client report (every finding with fix instructions, great for deliverables).",
                        "default": "summary"
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
