# 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 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

## Local SEO Presence Auditor

### 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

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

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