# SEO & Meta Tags Health Auditor (`zaden/my-actor-1`) Actor

Fast, no-browser audit of on-page SEO fundamentals: title/description length, canonical tag, Open Graph & Twitter Card tags, heading structure, robots directives, and robots.txt/sitemap.xml presence. Get a prioritized issue list and a 0-100 score per URL in seconds. Also in Full Site Health Suite.

- **URL**: https://apify.com/zaden/my-actor-1.md
- **Developed by:** [Zaden](https://apify.com/zaden) (community)
- **Categories:** SEO tools, Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.80 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#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 & Meta Tags Health Auditor

A fast, no-browser audit of the on-page SEO fundamentals that most directly affect how a page shows up in search results and social previews. Point it at one or more URLs and get back title/description checks, canonical and robots-meta status, heading structure, Open Graph/Twitter Card presence, and robots.txt/sitemap.xml discovery -- plus a **letter grade**, a 0-100 score, a severity tag, and a plain-English summary.

### What you get, per URL

- A **letter grade (A+ to F)** and 0-100 score summarizing on-page SEO health at a glance
- A one-line **executive summary** ("Robots meta tag blocks indexing... this page won't appear in search results.")
- A **severity** tag -- `critical` (page returns an HTTP error, or a robots meta tag blocks indexing entirely), `warning` (other issues), or `ok` -- for instant triage
- **Title and meta description** presence and length, checked against configurable ideal ranges
- **Canonical URL** and **robots meta tag** (flagged if it blocks indexing)
- **Heading structure**: number of `<h1>` tags found (zero or multiple both flagged)
- **Open Graph and Twitter Card** tags, which control link previews on social platforms
- **Viewport meta tag** presence (mobile-friendliness signal)
- **robots.txt and sitemap.xml discovery**, checked once per unique domain and shared across every URL on that domain
- Pages are audited **in parallel** (configurable), so a batch of 50 URLs finishes in a fraction of the time a one-by-one audit would take

### Why this instead of checking manually

|| Manual spot-checks | SEO & Meta Tags Health Auditor |
|---|---|---|
| Coverage | Whatever page you remember to test | Every URL you list, automatically |
| Speed | View-source, scroll, repeat per page | Seconds, via parallel auditing |
| Triage | You read the raw HTML yourself | Pre-classified severity + letter grade |
| Repeatability | Forgotten until traffic drops | One click, or schedule it |
| Output | Notes in a doc | Structured dataset, exportable to CSV/JSON/BI tools |

### Who this is for

- SEO consultants and agencies running a quick health check across client pages
- Developers verifying meta tags are set correctly before or after a launch
- Content teams auditing a batch of blog posts or product pages
- Anyone who wants a fast first pass before a full SEO audit tool

### How to use it

1. Add one or more **URLs to audit**.
2. Optionally adjust the **ideal title/description length ranges**, whether to **check robots.txt and sitemap.xml**, and **concurrency**.
3. Run it once for a snapshot, or put it on an Apify **Schedule** to catch a dropped meta tag after a CMS or template change.

### Example output (one item)

```json
{
  "url": "https://example.com/",
  "statusCode": 200,
  "responseTimeMs": 180,
  "score": 40,
  "grade": "F",
  "severity": "warning",
  "summary": "6 issue(s) found -- review recommended.",
  "issueCount": 6,
  "issues": [
    "Title is short (14 chars) -- consider expanding toward 30-60 characters.",
    "Missing meta description.",
    "Missing canonical link tag.",
    "No Open Graph tags found -- link previews on social platforms will look generic.",
    "robots.txt not found at the site root.",
    "sitemap.xml not found at the site root."
  ],
  "title": "Example Domain",
  "titleLength": 14,
  "metaDescription": null,
  "metaDescriptionLength": null,
  "canonicalUrl": null,
  "robotsMeta": null,
  "lang": null,
  "hasViewportMeta": false,
  "h1Count": 1,
  "h1Text": "Example Domain",
  "openGraph": { "title": null, "description": null, "image": null },
  "twitterCard": null,
  "robotsTxtFound": false,
  "sitemapFound": false,
  "checkedAt": "2026-08-22T00:00:00.000Z"
}
```

### Pricing

This Actor uses pay-per-event pricing:

- **Page audited** -- charged once per URL processed.

Parallel auditing doesn't cost more -- it just finishes faster.

### FAQ

**Is this a full SEO audit tool?**
No. It's a fast, explainable check of the on-page fundamentals -- title, description, headings, canonical, robots meta, Open Graph, and robots.txt/sitemap.xml presence. It doesn't check backlinks, keyword rankings, Core Web Vitals, or content quality.

**What makes something "critical" vs. a "warning"?**
`critical` covers the two failures that mean a page effectively can't be found in search at all: the page returns an HTTP error (4xx/5xx), or a robots meta tag actively blocks indexing (`noindex`). `warning` covers everything else that lowers the score -- worth fixing, but the page can still be indexed.

**Does this render JavaScript-injected tags?**
No. It reads the raw HTML response, the same way search engine crawlers typically do for meta tags. If your tags are injected client-side after page load, they won't be seen here.

**Will higher concurrency get me rate-limited?**
It can, on servers with aggressive rate limiting. Start at the default (5) and lower it if you see timeouts spike for a particular site.

**Does this send data anywhere besides your own Apify account?**
No. It only fetches the URLs you provide (and, optionally, each domain's robots.txt/sitemap.xml) and returns what it finds.

# Actor input Schema

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

One or more full page URLs to audit (e.g. "https://example.com/"). Each is fetched once and scored independently.

## `checkRobotsAndSitemap` (type: `boolean`):

Also fetch <origin>/robots.txt and <origin>/sitemap.xml once per unique domain and flag if either is missing.

## `titleLengthRange` (type: `object`):

Titles outside this range are flagged as too short or too long for typical search result display.

## `descriptionLengthRange` (type: `object`):

Meta descriptions outside this range are flagged as too short or too long for typical search result display.

## `concurrency` (type: `integer`):

How many pages to fetch and audit in parallel. Per-origin robots.txt/sitemap.xml checks are cached and shared, so this stays gentle on any one domain even at higher values.

## Actor input object example

```json
{
  "urls": [
    "https://example.com/"
  ],
  "checkRobotsAndSitemap": true,
  "titleLengthRange": {
    "min": 30,
    "max": 60
  },
  "descriptionLengthRange": {
    "min": 70,
    "max": 160
  },
  "concurrency": 5
}
```

# Actor output Schema

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

SEO audit results for each URL: score, issues found, and all extracted tag data.

# 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("zaden/my-actor-1").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("zaden/my-actor-1").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 '{
  "urls": [
    "https://example.com/"
  ]
}' |
apify call zaden/my-actor-1 --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,zaden/my-actor-1"
        }
    }
}

```

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/pds60Nma1mZ1It7Li/builds/5SF24gNkuCz1RpTcx/openapi.json
