# Merchant Feed QA — Price, Stock & Product Data Audit (`abdullah97/merchant-feed-qa`) Actor

Find feed data errors and compare expected price and stock with product-page JSON-LD.

- **URL**: https://apify.com/abdullah97/merchant-feed-qa.md
- **Developed by:** [Abdullah](https://apify.com/abdullah97) (community)
- **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/actors/running/actors-in-store.md#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

## Merchant Feed QA — Price, Stock & Product Data Audit

Check your product feed before the next campaign or promotion. This Actor validates
Google-style feed fields and compares valid rows with the price, currency and
availability in the product landing page's server-rendered JSON-LD.

Built for shopping-ad specialists, ecommerce operators and agencies. Output is a
prioritized issue list with evidence and a suggested fix for each finding.

### Start here

For a fictional demonstration with no web traffic or Actor event fees:

```
{"demoMode": true}
```

For a real check, replace these example URLs with your own:

```
{
  "products": [{
    "id": "bag-blue",
    "sku": "BAG-BLUE",
    "title": "Everyday Backpack",
    "link": "https://your-store.example/products/backpack",
    "image_link": "https://your-store.example/images/backpack.jpg",
    "price": "79.00 USD",
    "availability": "in_stock"
  }],
  "maxItems": 100
}
```

Alternatively supply feedUrl for a public CSV, TSV, JSON, RSS or Atom feed.
Do not supply both products and feedUrl. No Merchant Center account connection
is required. The .example URLs above are placeholders, not live targets.

### What you receive

- Feed checks: missing essential fields, malformed URLs, invalid price/currency,
  invalid sale intervals, unsupported availability and invalid GTIN checksum.
- Landing-page checks: price, currency and stock differences; confirmed 404/410.
- Change comparison: new and resolved issues against an earlier snapshot.
- Dataset rows with issues, data, changes, status and billable.
- SUMMARY, SNAPSHOT, REPORT and a formula-safe EXPORT CSV in run storage.

Feed price format is "19.99 USD". Optional sale\_price follows the same format.
sale\_price\_effective\_date is a timezone-aware ISO interval such as
"2026-11-20T00:00:00Z/2026-11-30T00:00:00Z". Without an interval, a valid sale price
is considered active. A sku selects a particular Product/Offer when present.

### Pricing

Proposed launch price: **$5 per 1,000 audited products** ($0.005 each), with normal
Actor runtime costs included. No startup fee or monthly rental. Billing event:
product-audited. Price must be activated in Apify Publication before sale.

A completed audit that discovers invalid feed fields is billable even when no
page fetch is necessary. Confirmed missing landing pages are also useful, billable
findings. Network failures, blocks and ambiguous extraction are unbillable.
Duplicate feed IDs are skipped with a summary notice. One product is billed once
per run, regardless of its number of findings. Unchanged audits are still checks.
Set the Apify maximum charge per run to control spending. A 100-product audit
costs at most $0.50 in Actor event fees.

### Monitoring

Paste the previous SNAPSHOT object into previousSnapshot, or supply an existing
stateStoreId you own together with a unique monitorId. The latter requires
explicit storage permissions on Apify. Schedule non-overlapping runs for the same
monitor. Store separate customers' baselines in separate stores. Unverified rows
retain their previous observations. The most recent 5,000 observations are retained.

The first observation establishes the baseline. This Actor returns changes; it
does not send messages. Use your own Apify/n8n/Make integration to route findings.

### Scope and limits

This is a focused diagnostic, not a complete Google policy validator, a feed
editor or a guarantee of approval. It compares JSON-LD, not the rendered checkout,
tax, shipping, discounts requiring login, geographic personalization or all
visible prices. JavaScript-only data, AggregateOffer ranges and ambiguous multiple
offers are not guessed. Missing availability is a warning, not a match.

Rows with invalid feed fields receive a validation-only audit; fix them and rerun
to inspect their landing pages. GTIN checks validate the checksum, not ownership.
Image URL syntax is checked; image files are not downloaded.

Maximum 1,000 unique items/run; 2 MB per HTTP response after decompression; 10-minute
crawl ceiling; bounded redirects and retries. Only public HTTP(S) pages and ports
80/443 are supported. robots.txt is respected. No proxies, browser rendering,
credentials or paid third-party APIs are required. Access failures are reported.
Use only feeds and pages you have permission to analyze.

Apify account plans, optional external integrations, and dataset access after
the run may incur separate platform charges. The demo has no Actor event fees;
platform execution can still consume usage.

# Actor input Schema

## `demoMode` (type: `boolean`):

Start here to try fictional examples without web requests or Actor event fees. Turn off and supply your own products, feed or URLs for a live audit.

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

Hard item limit per run, including unbillable errors. Duplicates are skipped.

## `previousSnapshot` (type: `object`):

Paste this Actor's previous SNAPSHOT output to compare runs without shared storage.

## `stateStoreId` (type: `string`):

Existing key-value store you own and explicitly grant this Actor read/write access to. Never share between customers.

## `monitorId` (type: `string`):

Required with stateStoreId. Unique per independent monitor; do not overlap runs for the same monitor.

## `products` (type: `array`):

Google-style rows: id, title, link, image\_link, price (19.99 USD), availability; optional sku, gtin, sale\_price, sale\_price\_effective\_date.

## `feedUrl` (type: `string`):

Public CSV, TSV, JSON, RSS or Atom feed, up to 2 MB. Supply products OR feedUrl.

## Actor input object example

```json
{
  "demoMode": true,
  "maxItems": 100
}
```

# Actor output Schema

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

No description

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

No description

## `snapshot` (type: `string`):

No description

## `csv` (type: `string`):

No description

## `report` (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 = {
    "demoMode": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("abdullah97/merchant-feed-qa").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 = { "demoMode": True }

# Run the Actor and wait for it to finish
run = client.actor("abdullah97/merchant-feed-qa").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 '{
  "demoMode": true
}' |
apify call abdullah97/merchant-feed-qa --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,abdullah97/merchant-feed-qa"
        }
    }
}
```

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/qgqClTRAIPxQ6UC5N/builds/cpEIVJwtwO1dvUExn/openapi.json
