# SEO Meta Tags Auditor (`phoenix2810/seo-meta-tags-auditor`) Actor

Audit a public page's SEO and social metadata in one API call. Checks title, meta description, canonical, robots, Open Graph, Twitter Card, hreflang, viewport, and JSON-LD.

- **URL**: https://apify.com/phoenix2810/seo-meta-tags-auditor.md
- **Developed by:** [Sanskar Jaiswal](https://apify.com/phoenix2810) (community)
- **Categories:** SEO tools, Developer tools, Open source
- **Stats:** 2 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 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 Auditor

Fetches one public web page and returns a structured audit of SEO and social preview metadata. It checks the title tag, meta description, canonical link, robots meta directives, viewport, Open Graph, Twitter Card, hreflang alternates, and JSON-LD structured data presence.

### Use cases

- Technical SEO QA before launches and migrations.
- Agency checks for client landing pages and product pages.
- Content operations validation before publishing campaigns.
- Programmatic monitoring for missing social preview tags.
- Developer tooling that needs a simple SEO metadata API result.

### Input

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `startUrl` | string | Yes | Public HTTP or HTTPS page URL to audit. URLs with credentials and private network targets are rejected. |
| `timeoutSeconds` | integer | No | Request timeout from 3 to 30 seconds. Default: 10. |
| `maxHtmlBytes` | integer | No | Maximum response bytes to parse. Default: 1048576. Maximum: 2097152. |

### Output

The actor pushes one dataset item per run.

| Field | Type | Description |
| --- | --- | --- |
| `inputUrl` | string | Original URL supplied by the user. |
| `finalUrl` | string | Final URL after safe redirects. |
| `ok` | boolean | Whether the fetch and audit completed. |
| `status` | integer or null | HTTP status returned by the page. |
| `contentType` | string | Response content type when available. |
| `checkedAt` | string | ISO timestamp for the audit. |
| `score` | integer | SEO metadata readiness score from 0 to 100. |
| `grade` | string | Letter grade: A, B, C, D, or F. |
| `metadata` | object or null | Parsed metadata fields. |
| `checks` | array | Per-check status, weight, points, and recommendation. |
| `recommendations` | array | Actionable recommendations for failed or warning checks. |
| `error` | string | Error message when `ok` is false. |

`metadata` contains:

| Field | Type | Description |
| --- | --- | --- |
| `url` | string | URL used for parsing. |
| `title` | string | Page title text. |
| `metaDescription` | string | Meta description content. |
| `robots` | string | Robots meta content. |
| `viewport` | string | Viewport meta content. |
| `canonical` | string | First canonical URL found. |
| `canonicalCount` | integer | Number of canonical links found. |
| `openGraph` | object | `title`, `description`, `type`, `image`, and `url`. |
| `twitterCard` | object | `card`, `title`, `description`, and `image`. |
| `hreflang` | array | Alternate hreflang links with `hreflang` and `href`. |
| `jsonLdCount` | integer | Number of JSON-LD script tags found. |

### Example input

```json
{
  "startUrl": "https://example.com/",
  "timeoutSeconds": 10,
  "maxHtmlBytes": 1048576
}
```

### Example output

```json
{
  "inputUrl": "https://example.com/",
  "finalUrl": "https://example.com/",
  "ok": true,
  "status": 200,
  "contentType": "text/html; charset=utf-8",
  "checkedAt": "2026-07-07T00:00:00.000Z",
  "score": 72,
  "grade": "C",
  "metadata": {
    "url": "https://example.com/",
    "title": "Example Domain",
    "metaDescription": "",
    "robots": "",
    "viewport": "width=device-width, initial-scale=1",
    "canonical": "https://example.com/",
    "canonicalCount": 1,
    "openGraph": {
      "title": "",
      "description": "",
      "type": "",
      "image": "",
      "url": ""
    },
    "twitterCard": {
      "card": "",
      "title": "",
      "description": "",
      "image": ""
    },
    "hreflang": [],
    "jsonLdCount": 0
  },
  "checks": [
    {
      "name": "Title length",
      "status": "warn",
      "weight": 15,
      "points": 7,
      "recommendation": "Keep the title between 20 and 65 characters for search snippets."
    }
  ],
  "recommendations": [
    "Keep the title between 20 and 65 characters for search snippets."
  ]
}
```

### Security

The actor only fetches public HTTP and HTTPS URLs. It rejects unsupported schemes, URL credentials, private IP literals, and hostnames that resolve to private network addresses. Redirect targets are revalidated before fetching. Response size is capped to reduce resource abuse.

### Pricing

Suggested pay-per-event pricing:

| Event | Suggested price |
| --- | ---: |
| Actor start | $0.005 |
| Page audited | $0.01 |

This keeps one-page checks inexpensive while allowing agencies and monitoring workflows to pay according to usage.

### Store listing notes

Target users: SEO agencies, technical SEO consultants, site migration QA teams, content operations teams, and developer-tool builders.

Store keywords: SEO meta tags API, meta description checker, Open Graph checker, Twitter Card checker, canonical tag checker, hreflang checker, JSON-LD audit, SEO QA automation.

Competitor weakness: many SEO tools expose this as a web UI or a broad crawler feature. This actor is a small API-first product that returns one normalized JSON record suitable for workflows, scheduled checks, and client reporting.

Kill or keep metric: keep if it receives organic Store impressions, runs, revenue, or inbound interest within 60 to 90 days. Improve the listing or pricing if impressions arrive without runs. Archive if it gets no discovery and no usage.

### FAQ

#### Does this crawl an entire website?

No. It audits one page per run. This keeps the actor fast, predictable, and easy to price per result.

#### Does it require login credentials?

No. It is designed for public pages only and rejects URLs containing credentials.

#### Does a warning always mean the page is wrong?

No. Some warnings are contextual. For example, hreflang is only required for multilingual sites, and JSON-LD is only relevant when structured data applies to the page.

#### Can this be scheduled?

Yes. Use Apify schedules to monitor important pages and export dataset results to your reporting or alerting workflow.

# Actor input Schema

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

Public HTTP or HTTPS page URL to audit. URLs with credentials and private network targets are rejected.

## `timeoutSeconds` (type: `integer`):

Request timeout from 3 to 30 seconds.

## `maxHtmlBytes` (type: `integer`):

Maximum number of response bytes to read before parsing. The actor caps this value at 2 MB.

## Actor input object example

```json
{
  "startUrl": "https://example.com/",
  "timeoutSeconds": 10,
  "maxHtmlBytes": 1048576
}
```

# Actor output Schema

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

// Run the Actor and wait for it to finish
const run = await client.actor("phoenix2810/seo-meta-tags-auditor").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("phoenix2810/seo-meta-tags-auditor").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 phoenix2810/seo-meta-tags-auditor --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/QcHUN39Ec1f4cAkst/builds/9lVun6rcyPgtbOz5O/openapi.json
