# AdSense Readiness Checker (`karaniphaustin/adsense-readiness-checker`) Actor

Audit any website for AdSense approval. Check SEO, security, accessibility, Core Web Vitals, mobile-friendliness in 5 minutes. Get actionable fix suggestions.

- **URL**: https://apify.com/karaniphaustin/adsense-readiness-checker.md
- **Developed by:** [karani phaustin](https://apify.com/karaniphaustin) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $4,000.00 / 1,000 domain scans

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

## AdSense Readiness Checker

**Audit any website for AdSense approval readiness. Check SEO, security headers, content quality, Core Web Vitals, mobile-friendliness, accessibility, and policy risks in under 5 minutes.**

[![Run on Apify](https://apify.com/img/run_on_apify.svg)](https://console.apify.com/actors/klH3e4SkldIgnebxO)

### What This Actor Does

This Actor audits any website for **Google AdSense approval readiness**. It performs a comprehensive multi-dimensional analysis to identify issues that could cause AdSense rejection.

#### Checks Performed

| Category | What We Check |
|----------|---------------|
| **SEO Basics** | Title tags, meta descriptions, H1 headings, canonical URLs, noindex detection |
| **Security Headers** | CSP, HSTS, X-Frame-Options, Referrer-Policy, Permissions-Policy, X-Content-Type-Options |
| **Content Quality** | Word count analysis, thin content detection, duplicate content clusters, uniqueness ratio |
| **Core Web Vitals** | LCP (Largest Contentful Paint), FID/INP, CLS (Cumulative Layout Shift) via Google PageSpeed API |
| **Mobile-Friendliness** | Viewport meta tag, responsive design detection, touch target sizing |
| **Accessibility** | HTML lang attribute, image alt text coverage, main landmark detection, form labels |
| **Structured Data** | JSON-LD schema analysis, rich results eligibility, required property validation |
| **Indexing Signals** | robots.txt, sitemap.xml, ads.txt presence and validation |
| **Policy Risks** | Piracy, adult content, scam keyword detection |
| **Trust Signals** | Privacy policy, terms of service, about page, contact page presence |

#### Unique Features (Competitors Don't Have These)

- **Accessibility audit** — Check HTML lang, alt text, landmarks, form labels
- **Security headers analysis** — CSP, HSTS, X-Frame-Options validation
- **Core Web Vitals** — Real metrics from Google PageSpeed API
- **Mobile-friendliness check** — Viewport, responsive design, touch targets
- **Structured data validation** — JSON-LD schemas, rich results eligibility
- **One-click fix suggestions** — Copy-paste code snippets for each issue
- **Competitor benchmarking** — Compare your site against up to 3 competitors
- **Before/after comparison** — Track improvements over time
- **Developer-friendly JSON output** — Integrate into CI/CD pipelines

### Input Parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `domain` | string | ✅ | - | Domain or URL to audit |
| `maxPages` | integer | | 20 | Pages to scan (1-100) |
| `mode` | string | | "preapply" | "preapply" or "rejected" |
| `competitors` | array | | \[] | Up to 3 competitor URLs to compare |
| `includeCoreWebVitals` | boolean | | true | Fetch CWV (adds ~15s) |
| `compareWithPrevious` | boolean | | false | Compare with previous scan |

#### Example Input

```json
{
  "domain": "https://example.com",
  "maxPages": 20,
  "mode": "preapply",
  "competitors": ["https://competitor1.com", "https://competitor2.com"]
}
```

### Output

The Actor returns a comprehensive JSON object:

```json
{
  "domain": "example.com",
  "scanId": "uuid",
  "score": 72,
  "risk": "Medium",
  "pagesScanned": 20,
  "categories": {
    "security": { "score": 85, "status": "good" },
    "seo": { "score": 70, "status": "warn" },
    "accessibility": { "score": 90, "status": "good" },
    "indexing": { "score": 60, "status": "warn" },
    "tech": { "score": 75, "status": "good" }
  },
  "coreWebVitals": {
    "status": "partial",
    "lcp": 2500,
    "fid": 120,
    "cls": 0.05,
    "score": 75
  },
  "mobileFriendliness": {
    "status": "pass",
    "hasViewportMeta": true,
    "isResponsive": true,
    "score": 85
  },
  "structuredDataAnalysis": {
    "types": ["Organization", "WebSite"],
    "richResults": [...],
    "errors": []
  },
  "blockers": [
    {
      "id": "missing-privacy",
      "severity": "blocker",
      "title": "Missing privacy policy",
      "why": "AdSense requires a clear privacy policy for visitors.",
      "fix": "Publish a privacy policy page and link it in the footer."
    }
  ],
  "issues": [...],
  "fixSuggestions": [
    {
      "id": "fix-missing-privacy",
      "title": "Add a Privacy Policy page",
      "effort": "easy",
      "code": "<a href=\"/privacy-policy\">Privacy Policy</a>",
      "instructions": [
        "Create a new page at /privacy-policy",
        "Include sections about data collection, cookies, AdSense",
        "Link in footer"
      ]
    }
  ],
  "recommendations": [...],
  "benchmark": {
    "summary": "Your site leads in 3/5 categories",
    "rankings": [...]
  },
  "fullReport": {...}
}
```

### Use Cases

#### 1. Pre-Application Check

Run an audit before applying to AdSense to identify and fix issues proactively.

```json
{
  "domain": "https://yoursite.com",
  "maxPages": 30,
  "mode": "preapply"
}
```

#### 2. Post-Rejection Diagnosis

If AdSense rejected your application, diagnose what went wrong.

```json
{
  "domain": "https://yoursite.com",
  "maxPages": 50,
  "mode": "rejected"
}
```

#### 3. Competitor Benchmarking

Compare your site against competitors to see where you stand.

```json
{
  "domain": "https://yoursite.com",
  "competitors": ["https://competitor1.com", "https://competitor2.com"],
  "maxPages": 10
}
```

#### 4. Track Improvements

Run a scan, fix issues, then run again to see a before/after comparison.

```json
{
  "domain": "https://yoursite.com",
  "compareWithPrevious": true
}
```

#### 5. CI/CD Integration

Integrate into your deployment pipeline to catch issues before they go live.

```bash
curl -X POST "https://api.apify.com/v2/acts/YOUR_ACTOR_ID/runs" \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"domain":"https://yoursite.com","maxPages":10}'
```

### Comparison vs Competitors

| Feature | This Actor | MonetizeMore ($19) |
|---------|-----------|-------------------|
| Accessibility audit | ✅ | ❌ |
| Security headers | ✅ | ❌ |
| Core Web Vitals | ✅ | ✅ |
| Mobile-friendliness | ✅ | ❌ |
| Structured data analysis | ✅ | ❌ |
| One-click fix suggestions | ✅ | ❌ |
| Competitor benchmarking | ✅ | ❌ |
| Before/after comparison | ✅ | ❌ |
| JSON output | ✅ | ❌ (PDF only) |
| Speed | 2-5 minutes | 60 minutes |
| Price | **$4-7** | $19 |

### Pricing

- **Pay-per-result**: $4-7 per domain scan
- Includes all checks and features
- No subscription required

### Tips for Best Results

1. **Scan at least 20-30 pages** for accurate content quality signals
2. **Include competitors** to see where you stand relative to others
3. **Run a scan, fix issues, then run again** to track improvements
4. **Use the `fixSuggestions` array** for actionable next steps with code snippets
5. **Check `blockers` first** — these are critical issues that will likely cause rejection

### FAQ

#### What's the difference between "preapply" and "rejected" mode?

- **preapply**: Check before applying to AdSense
- **rejected**: If you were rejected, this mode focuses on common rejection reasons

#### How accurate is this tool?

This tool checks technical and content signals that correlate with AdSense approval. It cannot guarantee approval (only Google can do that), but it identifies the most common rejection reasons.

#### Do I need a PageSpeed API key?

No. The tool works without an API key using Google's free tier. For higher volume, you can add your own free PageSpeed API key.

#### How many pages should I scan?

- For quick checks: 10-20 pages
- For comprehensive audits: 30-50 pages
- Maximum: 100 pages

#### What if my scan times out?

Large sites (100 pages) may take 3-5 minutes. If it times out, try reducing `maxPages` or contact support.

### Support

- **Issues**: Open an issue on the Actor page
- **Questions**: Contact via Apify Console

***

**Pass AdSense review on the first try. We check what others miss.**

# Actor input Schema

## `domain` (type: `string`):

The domain or full URL to scan for AdSense readiness

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

Maximum number of pages to analyze (1-100). More pages = more comprehensive but slower.

## `mode` (type: `string`):

Pre-application: Check before applying to AdSense. Post-rejection: Diagnose why you were rejected.

## `competitors` (type: `array`):

Compare your site against up to 3 competitors

## `includeCoreWebVitals` (type: `boolean`):

Fetch Core Web Vitals via PageSpeed API (adds ~15 seconds)

## `compareWithPrevious` (type: `boolean`):

If you've scanned this domain before, generate a before/after comparison

## Actor input object example

```json
{
  "domain": "https://example.com",
  "maxPages": 20,
  "mode": "preapply",
  "competitors": [],
  "includeCoreWebVitals": true,
  "compareWithPrevious": false
}
```

# Actor output Schema

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

Complete AdSense readiness report with scores, blockers, issues, and fix suggestions

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

// Run the Actor and wait for it to finish
const run = await client.actor("karaniphaustin/adsense-readiness-checker").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 = { "domain": "https://example.com" }

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,karaniphaustin/adsense-readiness-checker"
        }
    }
}
```

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/klH3e4SkldIgnebxO/builds/ZBDYTtbjkMfTgBVNf/openapi.json
