schemaorg-validate 0.3.0

Parse and validate Schema.org structured data (JSON-LD, Microdata, RDFa) against the official vocabulary and Google Rich Results profiles.
Documentation
# Product Profile

**Source:** [Google Product structured data](https://developers.google.com/search/docs/appearance/structured-data/product)

## Supported Types

- `Product`

## Required Fields

| Field | Description |
|-------|-------------|
| `name` | Product name |

## Recommended Fields

| Field | Description |
|-------|-------------|
| `image` | Product image URL |
| `description` | Product description |
| `sku` | Stock-keeping unit identifier |
| `gtin` / `isbn` / `mpn` | At least one product identifier |
| `brand.name` | Brand name |
| `aggregateRating` or `review` | At least one rating or review |

## Nested Requirements: Offer

When `offers` is present, each `Offer` is checked for:

| Field | Level | Description |
|-------|-------|-------------|
| `price` | Required | Numeric price value |
| `priceCurrency` | Required | ISO 4217 currency code |
| `availability` | Required | Item availability enum |
| `url` | Recommended | URL to the offer page |
| `priceValidUntil` | Recommended | Offer expiration date |
| `itemCondition` | Recommended | Item condition enum |

## Eligible Example

```json
{
  "@type": "Product",
  "name": "Premium Widget",
  "image": "https://example.com/widget.jpg",
  "description": "A high-quality widget",
  "sku": "WDG-001",
  "brand": { "@type": "Brand", "name": "WidgetCo" },
  "offers": {
    "@type": "Offer",
    "price": "29.99",
    "priceCurrency": "EUR",
    "availability": "https://schema.org/InStock"
  },
  "aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": "4.5",
    "reviewCount": "42"
  }
}
```

## Not Eligible Example

```json
{
  "@type": "Product"
}
```

Missing `name` -- required for eligibility.