# SitePulse (`upscale_audio/sitepulse`) Actor

Instant SEO & technical audit for 100+ pages. Finds broken links, missing alts, slow pages + gives SEO score & fixes in JSON. Perfect for agencies & devs. Pay-per-use. Schedule weekly.

- **URL**: https://apify.com/upscale\_audio/sitepulse.md
- **Developed by:** [Astral Shard](https://apify.com/upscale_audio) (community)
- **Categories:** SEO tools, Developer tools, Automation
- **Stats:** 9 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.01 / 1,000 results

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## SEO Audit Beast 🚀

A production-ready Apify Actor that performs comprehensive SEO audits on websites by crawling pages and analyzing key SEO metrics. Perfect for agencies, developers, and businesses looking to improve their website's search engine optimization.

### Features

- 🔍 **Comprehensive SEO Analysis**: Analyzes titles, meta descriptions, headings, images, links, and page speed
- ⚡ **Dual Mode**: Fast Cheerio mode (HTML parsing) or Puppeteer mode (JavaScript-rendered pages)
- 🤖 **Robots.txt Respect**: Automatically respects robots.txt rules
- 🎯 **Rate Limiting**: Intelligent rate limiting (1 request/second per domain) to avoid overwhelming servers
- 🔗 **Broken Link Detection**: Identifies broken internal and external links
- 📊 **SEO Scoring**: Calculates a 0-100 SEO score for each page with actionable fixes
- 🎨 **Actionable Fixes**: Provides specific recommendations for improving SEO
- 📈 **Scalable**: Handles large websites with configurable depth and page limits

### Quick Start

#### Input Schema

```json
{
  "startUrl": "https://example.com",
  "maxDepth": 3,
  "maxPages": 100,
  "includeSubdomains": false,
  "renderJs": false
}
```

#### Parameters

- **startUrl** (required): The website URL to audit (e.g., `https://example.com`)
- **maxDepth** (default: 3): Maximum crawl depth from the start URL (1-10)
- **maxPages** (default: 100): Maximum number of pages to crawl (10-1000)
- **includeSubdomains** (default: false): Whether to include subdomains in the crawl
- **renderJs** (default: false): Use Puppeteer to render JavaScript-rendered pages (slower but more accurate)

### Output

- **HTML Report**: View in **Key-value store → REPORT** (beautiful, shareable)
- **JSON Data**: Full details in **Dataset tab** (free download)

### Hero Example

#### Input

```json
{
  "startUrl": "https://example.com",
  "maxDepth": 2,
  "maxPages": 50,
  "renderJs": false
}
```

#### Output

Each page returns a JSON object like this:

```json
{
  "url": "https://example.com",
  "statusCode": 200,
  "title": "Example Domain",
  "titleLength": 14,
  "metaDescription": "This domain is for use in illustrative examples in documents.",
  "metaDescriptionLength": 62,
  "metaDescriptionMissing": false,
  "h1Count": 1,
  "h2Count": 3,
  "imageCount": 5,
  "imagesWithoutAlt": 2,
  "internalLinks": 12,
  "externalLinks": 3,
  "brokenLinks": ["https://example.com/old-page"],
  "pageSpeedScore": 85,
  "seoScore": 72,
  "fixes": [
    "Add alt text to 2 image(s)",
    "Meta description is too short (recommended: 120-160 characters)"
  ]
}
```

### Use Cases

#### 1. Agency SEO Audits

Perfect for digital marketing agencies performing regular SEO audits for clients. Schedule weekly audits to track improvements and identify new issues.

#### 2. Pre-Launch Website Checks

Before launching a new website or major update, run a comprehensive audit to ensure all SEO best practices are in place.

#### 3. Competitive Analysis

Audit competitor websites to understand their SEO strategy and identify opportunities for your own site.

#### 4. Content Quality Assurance

Ensure all pages have proper titles, meta descriptions, and heading structures before publishing.

#### 5. Technical SEO Monitoring

Regularly monitor your website for broken links, missing alt tags, and other technical SEO issues.

### Sample Output

#### Good SEO Score Example

```json
{
  "url": "https://example.com/about",
  "statusCode": 200,
  "title": "About Us - Example Company | Leading Provider of Solutions",
  "titleLength": 57,
  "metaDescription": "Learn about Example Company, a leading provider of innovative solutions. We've been serving customers since 2010 with excellence and dedication.",
  "metaDescriptionLength": 142,
  "metaDescriptionMissing": false,
  "h1Count": 1,
  "h2Count": 4,
  "imageCount": 8,
  "imagesWithoutAlt": 0,
  "internalLinks": 15,
  "externalLinks": 5,
  "brokenLinks": [],
  "pageSpeedScore": 92,
  "seoScore": 95,
  "fixes": []
}
```

#### Needs Improvement Example

```json
{
  "url": "https://example.com/products",
  "statusCode": 200,
  "title": "Products",
  "titleLength": 8,
  "metaDescription": "",
  "metaDescriptionLength": 0,
  "metaDescriptionMissing": true,
  "h1Count": 0,
  "h2Count": 2,
  "imageCount": 20,
  "imagesWithoutAlt": 12,
  "internalLinks": 8,
  "externalLinks": 2,
  "brokenLinks": ["https://example.com/discontinued"],
  "pageSpeedScore": 45,
  "seoScore": 23,
  "fixes": [
    "Add a page title",
    "Add a meta description",
    "Add an H1 heading",
    "Add alt text to 12 image(s)",
    "Improve page load speed (optimize images, minify CSS/JS)"
  ]
}
```

### SEO Metrics Explained

#### Title

- **Optimal Length**: 30-60 characters
- **Importance**: Critical for SEO and click-through rates
- **Score Impact**: 25 points

#### Meta Description

- **Optimal Length**: 120-160 characters
- **Importance**: Influences click-through rates from search results
- **Score Impact**: 20 points

#### H1 Heading

- **Optimal Count**: Exactly 1 per page
- **Importance**: Primary heading that helps search engines understand page content
- **Score Impact**: 15 points

#### Images with Alt Text

- **Optimal**: 100% of images should have alt attributes
- **Importance**: Accessibility and SEO for image search
- **Score Impact**: 15 points

#### Page Speed

- **Optimal Score**: 90-100
- **Calculation**: Based on estimated load time from HTML size and asset count
- **Score Impact**: 25 points

### Pro Tips

#### 🕐 Schedule Weekly Audits

Use the Apify Scheduler to automatically run SEO audits weekly. This helps you:

- Track SEO improvements over time
- Catch new issues early
- Maintain consistent SEO quality

**How to Schedule:**

1. Go to your Actor in Apify Console
2. Navigate to the "Schedules" tab
3. Click "Create Schedule"
4. Set frequency to weekly
5. Configure your input parameters

#### ⚡ Performance Optimization

- Use `renderJs: false` for faster audits (most websites work fine)
- Use `renderJs: true` only for single-page applications (SPA) or heavily JavaScript-dependent sites
- Adjust `maxPages` and `maxDepth` based on your website size

#### 🎯 Focus Areas

- **Critical Issues**: Fix pages with SEO scores below 50 first
- **High-Traffic Pages**: Prioritize homepage, product pages, and landing pages
- **Broken Links**: Fix broken links immediately as they hurt user experience and SEO

### Technical Details

#### Crawling Behavior

- Respects `robots.txt` rules
- Skips non-HTML files (PDFs, images, videos, etc.)
- Rate limited to 1 request/second per domain
- Maximum concurrency: 5 pages at a time
- Handles redirects, 404s, and timeouts gracefully

#### Browser Mode (Puppeteer)

When `renderJs: true`:

- Uses headless Chrome
- Waits for network idle before analyzing
- Captures JavaScript-rendered content
- More accurate for SPAs but slower

#### Fast Mode (Cheerio)

When `renderJs: false`:

- Pure HTML parsing (no browser)
- Much faster execution
- Works for most traditional websites
- Lower resource usage

### Deployment

#### Prerequisites

- Node.js 16+
- Apify account

#### Deploy to Apify

1. **Install Apify CLI** (if not already installed):
   ```bash
   npm install -g apify-cli
   ```

2. **Login to Apify**:
   ```bash
   apify login
   ```

3. **Create Actor**:
   ```bash
   apify create
   ```
   Select "Empty" template and name it "seo-audit-beast"

4. **Copy files**:
   - Copy `main.js` to the actor directory
   - Copy `package.json` to the actor directory
   - Copy `input_schema.json` to the actor directory

5. **Push to Apify**:
   ```bash
   apify push
   ```

6. **Test in Apify Console**:
   - Go to your Actor in Apify Console
   - Test with a sample URL
   - Review the output dataset

### Actor Quality Score

This Actor is designed to achieve a quality score of 70+ by:

- ✅ Proper error handling
- ✅ Comprehensive input validation
- ✅ Respecting robots.txt
- ✅ Rate limiting to avoid server overload
- ✅ Clear, actionable output
- ✅ Production-ready code structure
- ✅ Proper use of Apify SDK features

### Support

For issues, questions, or contributions:

- Check the Apify documentation: https://docs.apify.com
- Review the Actor logs in Apify Console
- Ensure your input parameters are valid

### License

ISC

***

**Made with ❤️ for better SEO**

# Actor input Schema

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

Website to audit (e.g., https://example.com)

## `maxDepth` (type: `integer`):

Maximum depth to crawl from the start URL

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

Maximum number of pages to crawl

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

Whether to include subdomains in the crawl

## `renderJs` (type: `boolean`):

Use Puppeteer to render JavaScript-rendered pages (slower but more accurate)

## Actor input object example

```json
{
  "startUrl": "https://example.com",
  "maxDepth": 3,
  "maxPages": 100,
  "includeSubdomains": false,
  "renderJs": false
}
```

# 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://example.com"
};

// Run the Actor and wait for it to finish
const run = await client.actor("upscale_audio/sitepulse").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://example.com" }

# Run the Actor and wait for it to finish
run = client.actor("upscale_audio/sitepulse").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 '{
  "startUrl": "https://example.com"
}' |
apify call upscale_audio/sitepulse --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

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