# Ecommerce SEO + Schema Price & Merchant Audit (`ruesandora/ecommerce-seo-schema-audit`) Actor

Audit product pages of your own store: SEO checks, structured-data price vs the price shown on the page, currency, availability and Merchant listing fields. Bulk product URLs or a store URL. Score per product, store summary and top fixes.

- **URL**: https://apify.com/ruesandora/ecommerce-seo-schema-audit.md
- **Developed by:** [Rues Forum](https://apify.com/ruesandora) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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

## Ecommerce SEO + Schema Price & Merchant Audit

Audit the product pages of your own online store in one run: on-page SEO checks **and** whether the price in your structured data matches the price shoppers see, plus currency, availability and Merchant listing fields. Give a **bulk list of product URLs** or your store home page. No API keys, no login.

### What does it do?

For every product page the Actor downloads the page once and returns:

- **SEO**: a score 0-100 and a grade, with the failing and warning checks (title, meta description, H1, canonical and variants, description length, duplicate text, image alt and size, internal links, indexability).
- **Schema and prices**: whether the Product markup price equals the main price on the page, price and currency format, availability value, Open Graph price, expired `priceValidUntil`, and which Merchant listing fields are present or missing.
- **Top fixes**: up to 5 ranked fixes per product, each marked as SEO or schema.
- A **store summary**: store score, number of price mismatches, products that are not Merchant-eligible and the top 5 store-wide fixes.

### Input

| Field | Description |
|---|---|
| `productUrls` | 1-200 product URLs (bulk paste or file upload) |
| `productUrlsText` | Optional text box: many URLs separated by new lines, spaces or commas |
| `storeUrl` | Your store home page; products are found via sitemap or Shopify `/products.json` when no URLs are given |
| `maxProducts` | Products to audit when discovering (1-200, default 20) |
| `language` | `en` or `tr` (fix texts) |

```json
{ "productUrls": ["https://shop.example.com/products/blue-mug"], "language": "en" }
```

Marketplaces (Amazon, Trendyol, Hepsiburada and similar) and private addresses are rejected: audit your own store only.

### Output

One row per product: `url`, `title`, `platform`, `score`, `grade`, `seo` (checks), `schema` (`priceMatch`, `priceInMarkup`, `visiblePrice`, `openGraph`, `merchant`, `issues`), `priceConsistent`, `topFixes`. Pages that could not be read have a `reason` and are not charged. The last row is the store `summary` (also saved as `SUMMARY`).

When the visible price cannot be determined (price loaded by JavaScript, or several competing prices), `priceMatch` is `not-comparable`. The Actor never guesses.

### Pricing (pay per event)

See the Pricing tab: one event per audited product page and one store summary per run (only if at least one product was audited). You can set a maximum cost per run; the Actor stops when it is reached.

### Politeness and safety

One request per second per host, own User-Agent, `robots.txt` respected (blocked pages are skipped and not charged). Every request and redirect is checked: private, loopback, link-local and metadata addresses are refused. No cookies, no login, no personal data.

### Limits

200 product pages per run.

Full report: https://ruesandora.com

### Technical notes

- Product discovery from `storeUrl`: sitemap (robots.txt `Sitemap:` lines, `/sitemap.xml`, nested indexes, `.gz`), then Shopify `/products.json`. Same site only.
- Limits per run: 200 products, 500 requests, 25 minutes, 2 MB per page.
- Duplicate title/description checks compare pages within the same run (later page is flagged).
- Sources of every rule: `KAYNAKLAR.md`.

# Actor input Schema

## `productUrls` (type: `array`):

1-200 product page URLs from your own store. Bulk paste or upload a file. Used instead of discovery when set.

## `productUrlsText` (type: `string`):

Optional. Paste many URLs separated by new lines, spaces or commas (for example a CSV column). Merged with the list above, duplicates removed, 200 max in total.

## `storeUrl` (type: `string`):

Your own store's home page, e.g. https://example-store.com. Products are found via the sitemap or Shopify /products.json when no product URLs are given. Marketplaces (Amazon, Trendyol, Hepsiburada ...) are not supported.

## `maxProducts` (type: `integer`):

How many products to audit when discovering from storeUrl (1-200).

## `language` (type: `string`):

Language of fix texts.

## Actor input object example

```json
{
  "storeUrl": "https://hydrogen-preview.myshopify.com",
  "maxProducts": 5,
  "language": "en"
}
```

# Actor output Schema

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

Audit rows pushed to the default dataset. Views: products, summary.

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

Run summary JSON stored as the SUMMARY record in the default key-value store.

# 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 = {
    "storeUrl": "https://hydrogen-preview.myshopify.com",
    "maxProducts": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("ruesandora/ecommerce-seo-schema-audit").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 = {
    "storeUrl": "https://hydrogen-preview.myshopify.com",
    "maxProducts": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("ruesandora/ecommerce-seo-schema-audit").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 '{
  "storeUrl": "https://hydrogen-preview.myshopify.com",
  "maxProducts": 5
}' |
apify call ruesandora/ecommerce-seo-schema-audit --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ruesandora/ecommerce-seo-schema-audit"
        }
    }
}
```

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/BCL800rwWK3qLBi72/builds/4gVz22Hqke4GVvDxY/openapi.json
