Merchant Feed Validator — XML, CSV, TSV & JSON avatar

Merchant Feed Validator — XML, CSV, TSV & JSON

Pricing

from $1.50 / 1,000 feed rows

Go to Apify Store
Merchant Feed Validator — XML, CSV, TSV & JSON

Merchant Feed Validator — XML, CSV, TSV & JSON

Validate Google-style merchant feeds before import. Find missing fields, duplicate IDs, invalid prices, availability values, overlong text, and GTIN checksum errors. Supports RSS/Atom XML, quoted CSV/TSV, and JSON with structured per-product issue codes.

Pricing

from $1.50 / 1,000 feed rows

Rating

0.0

(0)

Developer

Ibrahim

Ibrahim

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a month ago

Last modified

Categories

Security

Limited permissions

Share

Validate Google-style merchant feeds before import. Find missing fields, duplicate IDs, invalid prices, availability values, overlong text, and GTIN checksum errors. Supports RSS/Atom XML, quoted CSV/TSV, and JSON with structured per-product issue codes.

Quick start

Try the small public demonstration fixture first, then replace its URL with your own public source:

{
"urls": [
"https://commerce-actor-demos.vercel.app/feed.xml"
],
"maxResults": 10
}

The demo source contains synthetic catalog data labelled as a test fixture. Results go straight into the default Dataset. Export JSON, CSV, or Excel in Apify Console. Diagnostics are saved as RUN_STATS.

What it does

Checks the common Google-style id, title, description, link, image_link, price, and availability fields. Supports namespaced RSS item and Atom entry feeds, quoted CSV/TSV, and JSON arrays or items/products wrappers. Identifier and preorder requirements are review warnings because requirements vary by category/country. This is a deterministic preflight checker, not a Google Merchant approval guarantee. Does not fetch each product link or validate every conditional Merchant attribute.

Output

Main dataset fields: id, title, valid, errorCount, warningCount, issues, rowNumber, sourceUrl. A stable recordKey is included for retry deduplication. Inspect the demo run's dataset for a complete working output example.

Verified demo output

This sample was returned by a successful cloud run against the public synthetic fixture.

[
{
"sourceUrl": "https://commerce-actor-demos.vercel.app/feed.xml",
"rowNumber": 1,
"id": "DEMO-001",
"title": "Demo linen shirt",
"valid": true,
"errorCount": 0,
"warningCount": 0,
"issues": [],
"product": {
"id": "DEMO-001",
"title": "Demo linen shirt",
"description": "Synthetic fixture, not a real product.",
"link": "https://example.com/product",
"image_link": "https://example.com/image.png",
"price": "29.99 USD",
"availability": "in_stock",
"gtin": "4006381333931"
}
},
{
"sourceUrl": "https://commerce-actor-demos.vercel.app/feed.xml",
"rowNumber": 2,
"id": "DEMO-BROKEN",
"title": "Intentionally invalid demo row",
"valid": false,
"errorCount": 5,
"warningCount": 1,
"issues": [
{
"severity": "error",
"field": "description",
"code": "MISSING_REQUIRED",
"message": "description is missing."
},
{
"severity": "error",
"field": "link",
"code": "MISSING_REQUIRED",
"message": "link is missing."
},
{
"severity": "error",
"field": "image_link",
"code": "MISSING_REQUIRED",
"message": "image_link is missing."
},
{
"severity": "error",
"field": "price",
"code": "INVALID_PRICE",
"message": "Use a non-negative decimal amount and three-letter currency, e.g. 19.99 USD."
},
{
"severity": "error",
"field": "availability",
"code": "INVALID_AVAILABILITY",
"message": "Use in_stock, out_of_stock, preorder, or backorder."
},
{
"severity": "warning",
"field": "gtin",
"code": "IDENTIFIER_REVIEW",
"message": "Review product identifiers; requirements depend on category and country."
}
],
"product": {
"id": "DEMO-BROKEN",
"title": "Intentionally invalid demo row",
"price": "USD 12",
"availability": "available"
}
}
]

Pricing

Configured launch price: $1.50 per 1,000 feed row records, plus a $0.00005 Actor-start event (memory-based, minimum one event). Check the live Pricing tab before running; discounted tiers may differ. Platform usage is included in pay-per-event pricing. Each dataset record is one event, including a validation result that reports issues. RUN_STATS diagnostics are not dataset items. Spending-limit checks stop new work before the next record.

Limits and honest failures

Default maxResults is 100. This is a preview cap, not a promise to export everything. Set a larger cap only after checking a sample. Up to 100 source URLs, 8 MB per document, 50,000 rows per feed, 30-second request timeouts, 512 KB image probes, conservative shared request spacing, and at most five redirects. Public HTTP(S) only. Private/reserved addresses and credential URLs are rejected; DNS destinations are checked and pinned. robots.txt is respected. 429/503 stops the source for a later retry. Login/CAPTCHA pages, browser-only markup, and denied requests are reported rather than bypassed.

All-source failure ends FAILED after saving diagnostics. Useful partial output remains available with a partial status. Truncation and spending-limit stops are marked separately. Migration/retry checkpoints and existing dataset record IDs prevent repeated output in the same run. New independent runs are charged normally.

Input

  • urls: 1–100 public HTTP(S) URLs. No credentials, private networks, custom ports, or access-control bypass.
  • maxResults: Global output cap. RUN_STATS reports truncation. Start with a small sample. Default: 100.
  • requestDelayMs: Shared host spacing. Requests stop on 429/503 instead of ignoring cooldowns. Default: 500.

API

Use your Apify token in the Authorization header. For small jobs:

curl -X POST \
'https://api.apify.com/v2/acts/skyfishdev~merchant-feed-validator/run-sync-get-dataset-items' \
-H 'Authorization: Bearer YOUR_APIFY_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"urls":["https://commerce-actor-demos.vercel.app/feed.xml"],"maxResults":10}'

For larger jobs, use the asynchronous runs endpoint, poll the run status, and fetch its default dataset.

Local development

npm ci
npm test
apify run --input-file examples/demo.json

No LLM bill, image-host subscription, or additional API key is required. Only process public sources you are authorized to use. This tool does not promise customer demand, Google approval, or complete data on every website.