Check Product and Offer structured data
https://seolyticize.com /api/v1/tools/validate_product_schema Reads product pages and checks their Product and Offer JSON-LD against what Google's merchant listings need — errors: name, image, offers as Offer (not AggregateOffer) with a price above 0 and an ISO 4217 priceCurrency (or a priceSpecification), a valid availability; warnings: brand (its name not empty or N/A), a GTIN or MPN or SKU, description, offers.url, itemCondition, priceValidUntil when it has passed, validFrom without an end date, shipping details with shippingDestination and deliveryTime, a return policy with applicableCountry and returnPolicyCategory, a rating with ratingValue and reviewCount, hasAdultConsideration values, a ProductGroup's productGroupID, variesBy and hasVariant, and with eu: true the energy efficiency class; notes: returnPolicyCountry, member programs, variants — says whether each page is eligible, and gives a completenessScore (required fields 50, aggregateRating 65, an identifier 75, shippingDetails 85, a return policy 90, three or more reviews 100). With no urls, the latest crawl's pages that carry Product markup (up to limit). render 'auto' renders a page in a browser when its HTML carries no Product markup, for stores that inject their JSON-LD with JavaScript. Answers 'is our product schema right' and 'why don't our products show prices in Google'. Free.
Parameters
Idempotency-KeystringheaderRequest body
application/json
clientIdstringrequiredurlsstring[]limitintegereubooleanrenderstring{
"clientId": "string",
"urls": [],
"limit": 10,
"eu": false,
"render": "auto"
}Code samples
cURL
curl -X POST "https://seolyticize.com/api/v1/tools/validate_product_schema" \
-H "Authorization: Bearer $SEOLYTICIZE_API_KEY" \
-H "Idempotency-Key: <value>" \
-H "Content-Type: application/json" \
-d '{"clientId":"string","urls":[],"limit":10,"eu":false,"render":"auto"}'TypeScript
Python
Go
PHP
Ruby
Java
Responses
data, and its meta.Example
{
"data": {},
"meta": {
"requestId": "string",
"costMicros": 0,
"cached": true,
"cachedFrom": "string",
"dataAsOf": "string",
"sources": [
"string"
],
"partial": true,
"next": [
{
"tool": "string",
"args": {},
"why": "string"
}
],
"nextCursor": "string",
"dryRun": true
}
}Schema
datarequiredmetaobjectrequiredShow child parameters
requestIdstringrequiredcostMicrosintegerrequiredcachedbooleanrequiredcachedFromstringdataAsOfstringsourcesstring[]partialbooleanrequirednextobject[]requiredShow child parameters
toolstringargsobjectwhystringnextCursorstringdryRunbooleanX-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerX-Request-IdstringExample
{
"error": "string",
"code": "string",
"next": "string",
"requestId": "string"
}Schema
errorstringrequiredcodestringnextstringrequestIdstringX-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerSame as 400 · POST /api/v1/tools/validate_product_schema
WWW-AuthenticatestringSame as 400 · POST /api/v1/tools/validate_product_schema
X-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerSame as 400 · POST /api/v1/tools/validate_product_schema
X-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerSame as 400 · POST /api/v1/tools/validate_product_schema
X-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerSame as 400 · POST /api/v1/tools/validate_product_schema
X-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerSame as 400 · POST /api/v1/tools/validate_product_schema
X-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerRetry-AfterintegerSame as 400 · POST /api/v1/tools/validate_product_schema
X-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-Resetinteger