# Merchant Feed Offer Audit (`h_murdock/merchant-feed-offer-audit`) Actor

Compare merchant feed prices, currencies and stock against supplied Product JSON-LD snapshots. Exact variant IDs, explicit uncertainty, JSON/CSV/HTML evidence.

- **URL**: https://apify.com/h\_murdock/merchant-feed-offer-audit.md
- **Developed by:** [Gilad Ronen](https://apify.com/h_murdock) (community)
- **Categories:** E-commerce, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.50 / completed report

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

### What does Merchant Feed Offer Audit do?

**Audit merchant feed prices, currencies, and availability against supplied Product JSON-LD snapshots.** Submit feed rows together with HTML or raw JSON-LD text from your crawl/export pipeline. The Actor returns an evidence-based decision for every row and downloadable JSON, evidence CSV, and HTML reports.

It runs entirely on supplied data. It does not visit URLs, execute JavaScript, fetch JSON-LD contexts, or inspect checkout pages. The data model follows [Schema.org Product](https://schema.org/Product) and [Offer](https://schema.org/Offer). A match means agreement with the supplied evidence; it does not certify Google Merchant Center approval.

### Why use this audit?

Rerun a batch after a price upload, inventory change, or storefront theme release. Exact SKU and GTIN checks help identify variant mistakes before the evidence reaches another system. If both identifiers are supplied, both must match the same Product. The Actor never chooses the first Product, cheapest offer, or an AggregateOffer price range.

Apify API access, integrations, run monitoring, and scheduling can connect this audit to your existing export pipeline. Each run must receive the snapshots you intend to check.

### How to use it

1. Export up to 250 feed rows with string IDs, source URLs, and SKU and/or GTIN.
2. Include the expected price and currency, availability, or currency alone. Use the exact sale price you want checked; there is no automatic sale selection.
3. Supply one snapshot for each exact source URL. Choose either `html` or `jsonLd`, where `jsonLd` is a raw JSON string. Both cannot appear in one snapshot.
4. Run the Actor and review the row decisions. Download `evidence.csv` for a flat investigation queue or `report.html` for a standalone report.
5. Fix the feed or source markup outside the Actor, capture new snapshots, and rerun.

See the Input tab for configuration and `examples/input.json` for a synthetic batch with both matching and problematic offers.

### Input and matching rules

`records` contains `id`, `url`, optional `sku` and `gtin`, and at least one expected comparison: `price`, `currency`, or `availability`. Price requires currency. IDs and identifiers remain strings, including leading zeros. GTIN input accepts 8, 12, 13, or 14 digits; it checks exact identity, not GS1 allocation or checksum validity. Missing identifiers produce ambiguity, since the URL alone cannot establish a variant.

`pages` contains `url`, exactly one of `html` or `jsonLd`, and an optional ISO 8601 `fetchedAt` timestamp with timezone. Timestamps are customer-supplied metadata, not verified freshness. Source URLs match exactly, including query, fragments, trailing slash, and case. Only HTTP(S) URLs without embedded credentials are accepted; none are fetched.

Prices use a dot decimal separator and up to 30 integer and 18 fractional digits. Expected prices must be strings. Numeric JSON-LD prices are parsed losslessly from raw text. `24.90` and `24.900` are equal; exponent notation, negative amounts, grouping separators, and currency symbols are unsupported. Currency codes are exact uppercase three-letter strings; no exchange conversion or ISO currency catalogue validation occurs.

Availability inputs are the four Merchant feed states: `in_stock`, `out_of_stock`, `preorder`, and `backorder`. Following [Google's availability mapping](https://support.google.com/merchants/answer/6324448?hl=en), InStock/LimitedAvailability/OnlineOnly map to in\_stock; Discontinued/InStoreOnly/OutOfStock/SoldOut map to out\_of\_stock; PreOrder/PreSale map to preorder; and BackOrder maps to backorder. Original terms remain in `availabilityRaw`; bare terms or HTTP(S) Schema.org URLs are accepted. Vehicle-only build\_to\_order is outside this release. Unknown availability remains incomplete. Every selected Offer must contain supported price, currency, and availability, even when your feed requests only one comparison.

The parser handles top-level arrays, `@graph`, embedded Products, and unique Offer `@id` references within the same snapshot. Products within ItemList/BreadcrumbList, itemListElement, and known related-product relationships are excluded, including nodes linked through those structures by @id. An identifier found only there produces explicit recommendation-only ambiguity. Root or graph Product evidence still does not prove that the page visibly presents that product as its primary item. Identical complete offers may form a consensus; all evidence remains in the report. Conflicting offers and multiple matching Product nodes remain ambiguous. SKU/GTIN matching is case-sensitive and does not trim or normalize identifiers. Repeated feed IDs preserve every occurrence with distinct row keys. Duplicate snapshot URLs and duplicate JSON-LD node definitions are never silently merged.

### Output

One dataset item contains the complete report, summary, and `rows` array. The Feed row decisions view expands the rows for inspection. Use the dedicated evidence CSV for a flat export rather than a generic flattening of the nested dataset.

| Field | Meaning |
|---|---|
| `status` | `match`, `mismatch`, `ambiguous`, or `missing_evidence` |
| `expected*` / `observed*` | Feed expectations and a complete selected offer consensus |
| `issues` | Stable finding codes, severity, explanation, and source locations |
| `evidence` | Candidate offer values, source URL, snapshot timestamp, script index, JSON Pointer |
| `rowKey` | Stable feed-ID-derived key plus occurrence number |

Observed consensus fields remain null when selection or evidence is unresolved. Candidate values remain available under `evidence`. Script and snapshot indices are zero-based; `-1` means absent. JSON Pointers refer to each individual JSON-LD script document. The CSV has one row per evidence item or finding, so a feed row may appear more than once.

Downloads are `OUTPUT` (complete JSON), `evidence.csv` (spreadsheet-safe cells), and `report.html` (escaped, script-free standalone HTML). Open the HTML download locally. Reports exclude raw HTML and unrelated page content. The supplied input remains in the run's input storage according to your Apify retention settings.

### Pricing and recovery

The initial price is **$0.50 per completed report**, covering up to 250 feed rows with platform usage included. There is one `report-completed` event and no separate startup or dataset-item event. Check the current Pricing tab before running. Findings do not add charges. A fresh run is a new billable report.

The Actor validates input and download sizes before publishing or charging. An insufficient event budget produces no report and no report event. The dataset JSON is the primary result. If interrupted while writing convenience downloads after the report charge, a resurrection verifies saved integrity and the input fingerprint, then recreates exports without a second report event. If the dataset write succeeded but its charge was interrupted, recovery charges the saved report once. This is recovery within the same run; starting a fresh run does not reuse another run's charge.

### Limits and support

Limits are 250 records, 250 snapshots, 4 MB combined input JSON, 100 JSON-LD scripts per page, 10,000 parsed values per page, 64 levels of JSON-LD nesting, and 100 offers per matched Product. Full JSON must remain under 8 MB and each download under 9 MB; split unusually verbose evidence into smaller runs. The Actor uses 1024 MB memory and a recommended 180-second timeout.

ProductGroup links and variant inheritance are explicitly unsupported in this release. Their presence blocks a clean result for that snapshot; use a direct Product snapshot without group relationships if your pipeline can supply one faithfully. Arbitrary context aliases, conditional pricing (`priceSpecification`, eligible region/customer/quantity), Offer itemOffered relationships, non-Offer types, malformed JSON, and missing fields remain unresolved. The presence of priceSpecification is a conservative unsupported condition, even alongside a direct price; it is not a confirmed price mismatch. Page-wide malformed scripts or unsupported contexts block clean results even if another script contains a matching Product. This conservative behavior prevents omitted evidence from appearing trustworthy.

There is no CSV input, live crawling, currency conversion, visible-price inference, automatic feed repair, tax or shipping adjustment, personalization, offer-date eligibility evaluation, or Google cached-view/checkout prediction. Submit only snapshots you are authorized to process. Use the Issues tab for reproducible problems, preferably with a small sanitized example.

# Actor input Schema

## `records` (type: `array`):

IDs remain strings. SKU and/or GTIN selects the exact variant; both must match when provided. Repeated feed IDs are retained as ambiguous.

## `pages` (type: `array`):

Exactly one html or raw jsonLd string per URL. No URL fetching. Raw JSON-LD strings preserve numeric price precision. Duplicate URLs remain ambiguous.

## Actor input object example

```json
{
  "records": [
    {
      "id": "blue-variant",
      "url": "https://shop.example/shirt?color=blue",
      "sku": "SKU-BLUE",
      "price": "24.90",
      "currency": "USD",
      "availability": "in_stock",
      "gtin": "0012345678905"
    },
    {
      "id": "wrong-currency",
      "url": "https://shop.example/mug",
      "sku": "MUG",
      "price": "24.90",
      "currency": "USD",
      "availability": "in_stock"
    },
    {
      "id": "conflicting-prices",
      "url": "https://shop.example/lamp",
      "sku": "LAMP",
      "price": "24.90",
      "currency": "USD",
      "availability": "in_stock"
    },
    {
      "id": "stock-unknown",
      "url": "https://shop.example/hat",
      "sku": "HAT",
      "price": "24.90",
      "currency": "USD",
      "availability": "in_stock"
    },
    {
      "id": "broken-markup",
      "url": "https://shop.example/bag",
      "sku": "BAG",
      "price": "24.90",
      "currency": "USD",
      "availability": "in_stock"
    },
    {
      "id": "group-review",
      "url": "https://shop.example/shoe",
      "sku": "SHOE",
      "price": "24.90",
      "currency": "USD",
      "availability": "in_stock"
    },
    {
      "id": "snapshot-needed",
      "url": "https://shop.example/missing",
      "sku": "NONE",
      "price": "24.90",
      "currency": "USD",
      "availability": "in_stock"
    }
  ],
  "pages": [
    {
      "url": "https://shop.example/shirt?color=blue",
      "html": "<!doctype html><html><head><script>/* theme */</script><script type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Product\",\"sku\":\"SKU-RED\",\"offers\":{\"@type\":\"Offer\",\"price\":\"19.90\",\"priceCurrency\":\"USD\",\"availability\":\"https://schema.org/InStock\"}},{\"@type\":\"Product\",\"sku\":\"SKU-BLUE\",\"offers\":{\"@type\":\"Offer\",\"price\":\"24.90\",\"priceCurrency\":\"USD\",\"availability\":\"https://schema.org/InStock\"},\"gtin13\":\"0012345678905\"}]}</script></head><body>Shirt</body></html>",
      "fetchedAt": "2026-09-29T09:00:00Z"
    },
    {
      "url": "https://shop.example/mug",
      "jsonLd": "{\"@type\":\"Product\",\"sku\":\"MUG\",\"offers\":{\"@type\":\"Offer\",\"price\":\"24.90\",\"priceCurrency\":\"EUR\",\"availability\":\"https://schema.org/InStock\"}}"
    },
    {
      "url": "https://shop.example/lamp",
      "jsonLd": "{\"@type\":\"Product\",\"sku\":\"LAMP\",\"offers\":[{\"@type\":\"Offer\",\"price\":\"24.90\",\"priceCurrency\":\"USD\",\"availability\":\"https://schema.org/InStock\"},{\"@type\":\"Offer\",\"price\":\"29.90\",\"priceCurrency\":\"USD\",\"availability\":\"https://schema.org/InStock\"}]}"
    },
    {
      "url": "https://shop.example/hat",
      "jsonLd": "{\"@type\":\"Product\",\"sku\":\"HAT\",\"offers\":{\"@type\":\"Offer\",\"price\":\"24.90\",\"priceCurrency\":\"USD\"}}"
    },
    {
      "url": "https://shop.example/bag",
      "jsonLd": "{\"@type\": \"Product\", broken"
    },
    {
      "url": "https://shop.example/shoe",
      "jsonLd": "{\"@type\":\"ProductGroup\",\"hasVariant\":[{\"@type\":\"Product\",\"sku\":\"SHOE\",\"offers\":{\"@type\":\"Offer\",\"price\":\"24.90\",\"priceCurrency\":\"USD\",\"availability\":\"https://schema.org/InStock\"}}]}"
    }
  ]
}
```

# Actor output Schema

## `dataset` (type: `string`):

One dataset item containing summary and every feed row.

## `json` (type: `string`):

Complete structured report.

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

One flat row per offer evidence or finding.

## `html` (type: `string`):

Download and open the standalone report.

# 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 = {
    "records": [
        {
            "id": "blue-variant",
            "url": "https://shop.example/shirt?color=blue",
            "sku": "SKU-BLUE",
            "price": "24.90",
            "currency": "USD",
            "availability": "in_stock",
            "gtin": "0012345678905"
        },
        {
            "id": "wrong-currency",
            "url": "https://shop.example/mug",
            "sku": "MUG",
            "price": "24.90",
            "currency": "USD",
            "availability": "in_stock"
        },
        {
            "id": "conflicting-prices",
            "url": "https://shop.example/lamp",
            "sku": "LAMP",
            "price": "24.90",
            "currency": "USD",
            "availability": "in_stock"
        },
        {
            "id": "stock-unknown",
            "url": "https://shop.example/hat",
            "sku": "HAT",
            "price": "24.90",
            "currency": "USD",
            "availability": "in_stock"
        },
        {
            "id": "broken-markup",
            "url": "https://shop.example/bag",
            "sku": "BAG",
            "price": "24.90",
            "currency": "USD",
            "availability": "in_stock"
        },
        {
            "id": "group-review",
            "url": "https://shop.example/shoe",
            "sku": "SHOE",
            "price": "24.90",
            "currency": "USD",
            "availability": "in_stock"
        },
        {
            "id": "snapshot-needed",
            "url": "https://shop.example/missing",
            "sku": "NONE",
            "price": "24.90",
            "currency": "USD",
            "availability": "in_stock"
        }
    ],
    "pages": [
        {
            "url": "https://shop.example/shirt?color=blue",
            "html": "<!doctype html><html><head><script>/* theme */</script><script type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Product\",\"sku\":\"SKU-RED\",\"offers\":{\"@type\":\"Offer\",\"price\":\"19.90\",\"priceCurrency\":\"USD\",\"availability\":\"https://schema.org/InStock\"}},{\"@type\":\"Product\",\"sku\":\"SKU-BLUE\",\"offers\":{\"@type\":\"Offer\",\"price\":\"24.90\",\"priceCurrency\":\"USD\",\"availability\":\"https://schema.org/InStock\"},\"gtin13\":\"0012345678905\"}]}</script></head><body>Shirt</body></html>",
            "fetchedAt": "2026-09-29T09:00:00Z"
        },
        {
            "url": "https://shop.example/mug",
            "jsonLd": "{\"@type\":\"Product\",\"sku\":\"MUG\",\"offers\":{\"@type\":\"Offer\",\"price\":\"24.90\",\"priceCurrency\":\"EUR\",\"availability\":\"https://schema.org/InStock\"}}"
        },
        {
            "url": "https://shop.example/lamp",
            "jsonLd": "{\"@type\":\"Product\",\"sku\":\"LAMP\",\"offers\":[{\"@type\":\"Offer\",\"price\":\"24.90\",\"priceCurrency\":\"USD\",\"availability\":\"https://schema.org/InStock\"},{\"@type\":\"Offer\",\"price\":\"29.90\",\"priceCurrency\":\"USD\",\"availability\":\"https://schema.org/InStock\"}]}"
        },
        {
            "url": "https://shop.example/hat",
            "jsonLd": "{\"@type\":\"Product\",\"sku\":\"HAT\",\"offers\":{\"@type\":\"Offer\",\"price\":\"24.90\",\"priceCurrency\":\"USD\"}}"
        },
        {
            "url": "https://shop.example/bag",
            "jsonLd": "{\"@type\": \"Product\", broken"
        },
        {
            "url": "https://shop.example/shoe",
            "jsonLd": "{\"@type\":\"ProductGroup\",\"hasVariant\":[{\"@type\":\"Product\",\"sku\":\"SHOE\",\"offers\":{\"@type\":\"Offer\",\"price\":\"24.90\",\"priceCurrency\":\"USD\",\"availability\":\"https://schema.org/InStock\"}}]}"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("h_murdock/merchant-feed-offer-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 = {
    "records": [
        {
            "id": "blue-variant",
            "url": "https://shop.example/shirt?color=blue",
            "sku": "SKU-BLUE",
            "price": "24.90",
            "currency": "USD",
            "availability": "in_stock",
            "gtin": "0012345678905",
        },
        {
            "id": "wrong-currency",
            "url": "https://shop.example/mug",
            "sku": "MUG",
            "price": "24.90",
            "currency": "USD",
            "availability": "in_stock",
        },
        {
            "id": "conflicting-prices",
            "url": "https://shop.example/lamp",
            "sku": "LAMP",
            "price": "24.90",
            "currency": "USD",
            "availability": "in_stock",
        },
        {
            "id": "stock-unknown",
            "url": "https://shop.example/hat",
            "sku": "HAT",
            "price": "24.90",
            "currency": "USD",
            "availability": "in_stock",
        },
        {
            "id": "broken-markup",
            "url": "https://shop.example/bag",
            "sku": "BAG",
            "price": "24.90",
            "currency": "USD",
            "availability": "in_stock",
        },
        {
            "id": "group-review",
            "url": "https://shop.example/shoe",
            "sku": "SHOE",
            "price": "24.90",
            "currency": "USD",
            "availability": "in_stock",
        },
        {
            "id": "snapshot-needed",
            "url": "https://shop.example/missing",
            "sku": "NONE",
            "price": "24.90",
            "currency": "USD",
            "availability": "in_stock",
        },
    ],
    "pages": [
        {
            "url": "https://shop.example/shirt?color=blue",
            "html": "<!doctype html><html><head><script>/* theme */</script><script type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Product\",\"sku\":\"SKU-RED\",\"offers\":{\"@type\":\"Offer\",\"price\":\"19.90\",\"priceCurrency\":\"USD\",\"availability\":\"https://schema.org/InStock\"}},{\"@type\":\"Product\",\"sku\":\"SKU-BLUE\",\"offers\":{\"@type\":\"Offer\",\"price\":\"24.90\",\"priceCurrency\":\"USD\",\"availability\":\"https://schema.org/InStock\"},\"gtin13\":\"0012345678905\"}]}</script></head><body>Shirt</body></html>",
            "fetchedAt": "2026-09-29T09:00:00Z",
        },
        {
            "url": "https://shop.example/mug",
            "jsonLd": "{\"@type\":\"Product\",\"sku\":\"MUG\",\"offers\":{\"@type\":\"Offer\",\"price\":\"24.90\",\"priceCurrency\":\"EUR\",\"availability\":\"https://schema.org/InStock\"}}",
        },
        {
            "url": "https://shop.example/lamp",
            "jsonLd": "{\"@type\":\"Product\",\"sku\":\"LAMP\",\"offers\":[{\"@type\":\"Offer\",\"price\":\"24.90\",\"priceCurrency\":\"USD\",\"availability\":\"https://schema.org/InStock\"},{\"@type\":\"Offer\",\"price\":\"29.90\",\"priceCurrency\":\"USD\",\"availability\":\"https://schema.org/InStock\"}]}",
        },
        {
            "url": "https://shop.example/hat",
            "jsonLd": "{\"@type\":\"Product\",\"sku\":\"HAT\",\"offers\":{\"@type\":\"Offer\",\"price\":\"24.90\",\"priceCurrency\":\"USD\"}}",
        },
        {
            "url": "https://shop.example/bag",
            "jsonLd": "{\"@type\": \"Product\", broken",
        },
        {
            "url": "https://shop.example/shoe",
            "jsonLd": "{\"@type\":\"ProductGroup\",\"hasVariant\":[{\"@type\":\"Product\",\"sku\":\"SHOE\",\"offers\":{\"@type\":\"Offer\",\"price\":\"24.90\",\"priceCurrency\":\"USD\",\"availability\":\"https://schema.org/InStock\"}}]}",
        },
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("h_murdock/merchant-feed-offer-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 '{
  "records": [
    {
      "id": "blue-variant",
      "url": "https://shop.example/shirt?color=blue",
      "sku": "SKU-BLUE",
      "price": "24.90",
      "currency": "USD",
      "availability": "in_stock",
      "gtin": "0012345678905"
    },
    {
      "id": "wrong-currency",
      "url": "https://shop.example/mug",
      "sku": "MUG",
      "price": "24.90",
      "currency": "USD",
      "availability": "in_stock"
    },
    {
      "id": "conflicting-prices",
      "url": "https://shop.example/lamp",
      "sku": "LAMP",
      "price": "24.90",
      "currency": "USD",
      "availability": "in_stock"
    },
    {
      "id": "stock-unknown",
      "url": "https://shop.example/hat",
      "sku": "HAT",
      "price": "24.90",
      "currency": "USD",
      "availability": "in_stock"
    },
    {
      "id": "broken-markup",
      "url": "https://shop.example/bag",
      "sku": "BAG",
      "price": "24.90",
      "currency": "USD",
      "availability": "in_stock"
    },
    {
      "id": "group-review",
      "url": "https://shop.example/shoe",
      "sku": "SHOE",
      "price": "24.90",
      "currency": "USD",
      "availability": "in_stock"
    },
    {
      "id": "snapshot-needed",
      "url": "https://shop.example/missing",
      "sku": "NONE",
      "price": "24.90",
      "currency": "USD",
      "availability": "in_stock"
    }
  ],
  "pages": [
    {
      "url": "https://shop.example/shirt?color=blue",
      "html": "<!doctype html><html><head><script>/* theme */</script><script type=\\"application/ld+json\\">{\\"@context\\":\\"https://schema.org\\",\\"@graph\\":[{\\"@type\\":\\"Product\\",\\"sku\\":\\"SKU-RED\\",\\"offers\\":{\\"@type\\":\\"Offer\\",\\"price\\":\\"19.90\\",\\"priceCurrency\\":\\"USD\\",\\"availability\\":\\"https://schema.org/InStock\\"}},{\\"@type\\":\\"Product\\",\\"sku\\":\\"SKU-BLUE\\",\\"offers\\":{\\"@type\\":\\"Offer\\",\\"price\\":\\"24.90\\",\\"priceCurrency\\":\\"USD\\",\\"availability\\":\\"https://schema.org/InStock\\"},\\"gtin13\\":\\"0012345678905\\"}]}</script></head><body>Shirt</body></html>",
      "fetchedAt": "2026-09-29T09:00:00Z"
    },
    {
      "url": "https://shop.example/mug",
      "jsonLd": "{\\"@type\\":\\"Product\\",\\"sku\\":\\"MUG\\",\\"offers\\":{\\"@type\\":\\"Offer\\",\\"price\\":\\"24.90\\",\\"priceCurrency\\":\\"EUR\\",\\"availability\\":\\"https://schema.org/InStock\\"}}"
    },
    {
      "url": "https://shop.example/lamp",
      "jsonLd": "{\\"@type\\":\\"Product\\",\\"sku\\":\\"LAMP\\",\\"offers\\":[{\\"@type\\":\\"Offer\\",\\"price\\":\\"24.90\\",\\"priceCurrency\\":\\"USD\\",\\"availability\\":\\"https://schema.org/InStock\\"},{\\"@type\\":\\"Offer\\",\\"price\\":\\"29.90\\",\\"priceCurrency\\":\\"USD\\",\\"availability\\":\\"https://schema.org/InStock\\"}]}"
    },
    {
      "url": "https://shop.example/hat",
      "jsonLd": "{\\"@type\\":\\"Product\\",\\"sku\\":\\"HAT\\",\\"offers\\":{\\"@type\\":\\"Offer\\",\\"price\\":\\"24.90\\",\\"priceCurrency\\":\\"USD\\"}}"
    },
    {
      "url": "https://shop.example/bag",
      "jsonLd": "{\\"@type\\": \\"Product\\", broken"
    },
    {
      "url": "https://shop.example/shoe",
      "jsonLd": "{\\"@type\\":\\"ProductGroup\\",\\"hasVariant\\":[{\\"@type\\":\\"Product\\",\\"sku\\":\\"SHOE\\",\\"offers\\":{\\"@type\\":\\"Offer\\",\\"price\\":\\"24.90\\",\\"priceCurrency\\":\\"USD\\",\\"availability\\":\\"https://schema.org/InStock\\"}}]}"
    }
  ]
}' |
apify call h_murdock/merchant-feed-offer-audit --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,h_murdock/merchant-feed-offer-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/eY8oHCgbXh8vKTfLc/builds/hDTfYaWLlg18QftNQ/openapi.json
