# Local SEO Presence Auditor (`junipr/local-seo-presence-auditor`) Actor

Audit local business pages, local schema, location consistency, and local search readiness signals from supplied HTML snapshots.

- **URL**: https://apify.com/junipr/local-seo-presence-auditor.md
- **Developed by:** [junipr](https://apify.com/junipr) (community)
- **Categories:** Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.90 / 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.

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

## 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/docs.md):

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.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/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

## Local SEO Presence Auditor

<!-- FIXED_INCLUSIVE_PPE_20260707_START -->
### Store Positioning

**Store title:** Local SEO Presence Auditor

**Short description:** Audit local business pages, local schema, location consistency, and local search readiness signals from supplied HTML snapshots.

**SEO title:** Local SEO Presence Auditor — technical SEO, web, and domain audit

**SEO description:** Audit local business pages, local schema, location consistency, and local search readiness signals from supplied HTML snapshots. Use it to find crawlability, indexability, security, metadata, and page-quality issues with evidence-backed rows and audit reports.

**Categories:** SEO_TOOLS, DEVELOPER_TOOLS

**Keywords:** local, seo, presence, auditor, seo audit, schema, local seo, web/domain audit

### Fixed-Inclusive PPE Pricing

This actor uses pay-per-event pricing. Event prices include Apify platform usage; users are not expected to pay a separate platform-usage pass-through charge for the configured pricing model.

- Tier: W1 — Web/domain audit
- Primary event: `page-audited` at $0.00490 base
- Default max charge: $10.00
- Store discounts: FREE/BRONZE base, SILVER discounted, GOLD deepest approved discount

Event set:

- `actor-start`: base $0.00500, GOLD $0.00400. Local SEO Presence Auditor: charged when actor start is completed. The price includes Apify platform usage; no separate usage pass-through is intended.
- `page-audited`: base $0.00490, GOLD $0.00392. Local SEO Presence Auditor: charged when page audited is completed. The price includes Apify platform usage; no separate usage pass-through is intended.
- `record-extracted`: base $0.00372, GOLD $0.00298. Local SEO Presence Auditor: charged when record extracted is completed. The price includes Apify platform usage; no separate usage pass-through is intended.
- `finding-emitted`: base $0.00372, GOLD $0.00298. Local SEO Presence Auditor: charged when finding emitted is completed. The price includes Apify platform usage; no separate usage pass-through is intended.
- `audit-report-generated`: base $0.05000, GOLD $0.04000. Local SEO Presence Auditor: charged when audit report generated is completed. The price includes Apify platform usage; no separate usage pass-through is intended.

### Public Task Concepts

- Audit Local SEO Presence controls with capped supplied targets
- Find high-priority Local SEO Presence issues before release
- Validate Local SEO Presence evidence from supplied pages
- Prioritize Local SEO Presence fixes with severity and proof
- Export Local SEO Presence QA rows for client review
<!-- FIXED_INCLUSIVE_PPE_20260707_END -->

Audit local business pages, local schema, location consistency, and local search readiness signals from supplied HTML snapshots.

This actor is fixture-first by default. It analyzes the HTML you provide, does not launch a browser, and does not fetch URLs unless `fetchUrls` is explicitly enabled. That makes it useful for local SEO QA pipelines, agency reporting, multi-location page checks, and deterministic pre-publication review.

### What It Checks

- LocalBusiness-style JSON-LD, including specific types such as `RoofingContractor`, `ProfessionalService`, `Restaurant`, and other local business entities.
- Business name, phone, address, city, and region consistency.
- Title, meta description, and first H1 presence.
- Map embeds, directions links, and clickable `tel:` links.
- Opening-hours and service-area signals.
- Expected local service/category phrase coverage.
- Risk signals and prioritized recommendations.

### Input Example

Set `maxChargeUsd` to a finite run budget. It defaults to `$10`; the actor stops before paid work or withholds uncharged reports when the next event would exceed the cap.

```json
{
  "targets": [
    {
      "sourceId": "nashville-roofing-page",
      "sourceUrl": "https://example.com/nashville-roofing",
      "businessName": "Acme Roofing Nashville",
      "expectedCity": "Nashville",
      "expectedRegion": "TN",
      "expectedPhone": "(615) 555-0199",
      "expectedAddress": "1200 Music Row, Nashville, TN 37203",
      "expectedCategories": ["roofing contractor", "roof repair"],
      "html": "<!doctype html><html>...</html>"
    }
  ],
  "fetchUrls": false,
  "includeReport": true,
  "maxTargets": 1
}
````

### Output

Each dataset item represents one audited local page:

```json
{
  "sourceId": "nashville-roofing-page",
  "status": "pass",
  "localPresenceScore": 100,
  "localBusinessSchemaDetected": true,
  "schemaTypes": ["RoofingContractor"],
  "napNameMatch": true,
  "napPhoneMatch": true,
  "napAddressMatch": true,
  "cityMentioned": true,
  "hasMapEmbed": true,
  "hasDirectionsLink": true,
  "hasTelLink": true,
  "riskSignalCodes": [],
  "recommendations": ["Maintain current local schema and NAP coverage; re-run after page copy or location data changes."]
}
```

When `includeReport` is enabled, the actor also writes:

- `LOCAL_SEO_PRESENCE_RESULTS.json`
- `LOCAL_SEO_PRESENCE_SUMMARY.json`
- `LOCAL_SEO_PRESENCE_REPORT.md`

### Limits And Safe Defaults

- Default run audits at most 3 targets.
- Hard cap is 50 targets per run.
- Default HTML cap is 500 KB per target.
- Hard HTML cap is 2 MB per target.
- `fetchUrls` defaults to `false`.
- Default input uses fixture HTML and makes no network calls.

### Limitations

- This actor does not guarantee rankings, map-pack placement, revenue, or citation consistency.
- Static HTML snapshots cannot prove Google Business Profile status or live search visibility.
- Optional URL fetch is a basic HTTP fetch, not browser rendering or proxy crawling.
- It does not collect sensitive personal data and should not be used for invasive lead enrichment.

### Safe Use

Audit pages you own or are authorized to evaluate. Do not upload private customer data, account dashboards, credentials, or unpublished client material unless you have permission to process it.

# Actor input Schema

## `targets` (type: `array`):

Local page HTML snapshots to audit. Defaults to a tiny deterministic local business fixture.

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

Optional URLs to fetch only when Fetch URLs is true. Leave empty for fixture/local runs.

## `fetchUrls` (type: `boolean`):

Fetch page HTML over HTTP. Default is false to avoid network work and Apify cloud credits.

## `businessName` (type: `string`):

Expected business/entity name for single-target shorthand input.

## `expectedPhone` (type: `string`):

Expected local phone number for NAP checks.

## `expectedAddress` (type: `string`):

Expected address for NAP checks.

## `expectedCity` (type: `string`):

Expected city or locality.

## `expectedRegion` (type: `string`):

Expected state, province, or region abbreviation.

## `expectedCategories` (type: `array`):

Expected local service/category phrases to look for in visible content.

## `maxItems` (type: `integer`):

Alias for Max Targets/Maximum Records used by the Junipr actor baseline. When both are provided, actor-specific limits still apply.

## `includeReport` (type: `boolean`):

Write summary JSON and Markdown report artifacts to the key-value store.

## `maxTargets` (type: `integer`):

Maximum local pages to audit.

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

Maximum HTML bytes to analyze per target.

## `maxChargeUsd` (type: `number`):

Hard local spending cap for actor-start, per-item, and report events. The actor stops before work or withholds uncharged output when the next event would exceed this amount.

## `dryRun` (type: `boolean`):

Validate input and write a dry-run summary without PPE charges or dataset output.

## `debug` (type: `boolean`):

Enable debug logs.

## Actor input object example

```json
{
  "targets": [],
  "urls": [],
  "fetchUrls": false,
  "businessName": "Example Local Business",
  "expectedPhone": "",
  "expectedAddress": "",
  "expectedCity": "",
  "expectedRegion": "",
  "expectedCategories": [],
  "maxItems": 3,
  "includeReport": true,
  "maxTargets": 3,
  "maxHtmlBytes": 500000,
  "maxChargeUsd": 10,
  "dryRun": false,
  "debug": false
}
```

# Actor output Schema

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

Local SEO audit rows in the default dataset.

## `summary` (type: `string`):

Summary JSON in the key-value store when includeReport is enabled.

## `markdownReport` (type: `string`):

Markdown report in the key-value store when includeReport is enabled.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("junipr/local-seo-presence-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("junipr/local-seo-presence-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 '{}' |
apify call junipr/local-seo-presence-auditor --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Local SEO Presence Auditor",
        "description": "Audit local business pages, local schema, location consistency, and local search readiness signals from supplied HTML snapshots.",
        "version": "1.0",
        "x-build-id": "APiZXULdHPhdi2kX4"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/junipr~local-seo-presence-auditor/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-junipr-local-seo-presence-auditor",
                "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/junipr~local-seo-presence-auditor/runs": {
            "post": {
                "operationId": "runs-sync-junipr-local-seo-presence-auditor",
                "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/junipr~local-seo-presence-auditor/run-sync": {
            "post": {
                "operationId": "run-sync-junipr-local-seo-presence-auditor",
                "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",
                "properties": {
                    "targets": {
                        "title": "Local Page Targets",
                        "type": "array",
                        "description": "Local page HTML snapshots to audit. Defaults to a tiny deterministic local business fixture.",
                        "items": {
                            "type": "object"
                        },
                        "default": []
                    },
                    "urls": {
                        "title": "URLs To Fetch",
                        "type": "array",
                        "description": "Optional URLs to fetch only when Fetch URLs is true. Leave empty for fixture/local runs.",
                        "items": {
                            "type": "string"
                        },
                        "default": []
                    },
                    "fetchUrls": {
                        "title": "Fetch URLs",
                        "type": "boolean",
                        "description": "Fetch page HTML over HTTP. Default is false to avoid network work and Apify cloud credits.",
                        "default": false
                    },
                    "businessName": {
                        "title": "Business Name",
                        "type": "string",
                        "description": "Expected business/entity name for single-target shorthand input.",
                        "default": "Example Local Business"
                    },
                    "expectedPhone": {
                        "title": "Expected Phone",
                        "type": "string",
                        "description": "Expected local phone number for NAP checks.",
                        "default": ""
                    },
                    "expectedAddress": {
                        "title": "Expected Address",
                        "type": "string",
                        "description": "Expected address for NAP checks.",
                        "default": ""
                    },
                    "expectedCity": {
                        "title": "Expected City",
                        "type": "string",
                        "description": "Expected city or locality.",
                        "default": ""
                    },
                    "expectedRegion": {
                        "title": "Expected Region",
                        "type": "string",
                        "description": "Expected state, province, or region abbreviation.",
                        "default": ""
                    },
                    "expectedCategories": {
                        "title": "Expected Categories",
                        "type": "array",
                        "description": "Expected local service/category phrases to look for in visible content.",
                        "items": {
                            "type": "string"
                        },
                        "default": []
                    },
                    "maxItems": {
                        "title": "Max Items",
                        "minimum": 1,
                        "maximum": 50,
                        "type": "integer",
                        "description": "Alias for Max Targets/Maximum Records used by the Junipr actor baseline. When both are provided, actor-specific limits still apply.",
                        "default": 3
                    },
                    "includeReport": {
                        "title": "Include Report Artifacts",
                        "type": "boolean",
                        "description": "Write summary JSON and Markdown report artifacts to the key-value store.",
                        "default": true
                    },
                    "maxTargets": {
                        "title": "Max Targets",
                        "minimum": 1,
                        "maximum": 50,
                        "type": "integer",
                        "description": "Maximum local pages to audit.",
                        "default": 3
                    },
                    "maxHtmlBytes": {
                        "title": "Max HTML Bytes",
                        "minimum": 1000,
                        "maximum": 2000000,
                        "type": "integer",
                        "description": "Maximum HTML bytes to analyze per target.",
                        "default": 500000
                    },
                    "maxChargeUsd": {
                        "title": "Maximum Charge (USD)",
                        "minimum": 0,
                        "maximum": 1000,
                        "type": "number",
                        "description": "Hard local spending cap for actor-start, per-item, and report events. The actor stops before work or withholds uncharged output when the next event would exceed this amount.",
                        "default": 10
                    },
                    "dryRun": {
                        "title": "Dry Run",
                        "type": "boolean",
                        "description": "Validate input and write a dry-run summary without PPE charges or dataset output.",
                        "default": false
                    },
                    "debug": {
                        "title": "Debug Logs",
                        "type": "boolean",
                        "description": "Enable debug logs.",
                        "default": false
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
