# Product schema (/docs/schema/product) The unified SocialCrawl product schema. Every field, its type, per-platform availability, and a machine-readable JSON Schema, generated from the canonical Zod source. Every SocialCrawl endpoint that returns a product gives you this exact shape, whatever the source platform. Write your parser once and the same code reads product data from every platform below. That is the unified schema: one contract instead of a dozen raw upstream formats. ## Field reference | Field | Type | Nullable | Description | | ----- | ---- | -------- | ----------- | | `id` | `string` | No | Platform product ID (Amazon ASIN / Google Shopping product id) | | `url` | `string` | Yes | Direct URL to the product page | | `title` | `string` | Yes | Product title | | `description` | `string` | Yes | | | `seller` | `string` | Yes | | | `brand` | `string` | Yes | Brand name (cleaned). Null when the platform exposes a seller instead. | | `price.current` | `integer` | Yes | | | `price.original` | `integer` | Yes | | | `price.currency` | `string` | Yes | | | `rating.average` | `integer` | Yes | | | `rating.count` | `integer` | Yes | | | `image_urls` | `string` or `string[]` | Yes | Primary image URL, or an array of image URLs for products with a gallery. | | `availability` | `string` | Yes | Stock/availability string when surfaced | | `reviews_count` | `integer` | Yes | | | `features` | `string[]` | Yes | | | `specifications` | `object[]` | Yes | | | `variations` | `object[]` | Yes | | ## Extension fields (`ext`) Platform-specific passthrough. Each field is present only on the platforms that expose it and is absent everywhere else, so treat every `ext.*` field as optional. These carry the richer, per-platform signals the unified leaves cannot hold, and the join keys that chain endpoints together. | Field | Type | Nullable | Description | | ----- | ---- | -------- | ----------- | | `ext.gid` | `string` | Yes | | | `ext.data_docid` | `string` | Yes | | | `ext.pvf` | `string` | Yes | | | `ext.seller_id` | `string` | Yes | | | `ext.sold_count` | `integer` | Yes | | | `ext.bought_past_month` | `integer` | Yes | | | `ext.bought_past_month_label` | `string` | Yes | | | `ext.catalog_id` | `string` | Yes | | | `ext.requested_id` | `string` | Yes | | | `ext.rating_distribution.star_1` | `integer` | Yes | | | `ext.rating_distribution.star_2` | `integer` | Yes | | | `ext.rating_distribution.star_3` | `integer` | Yes | | | `ext.rating_distribution.star_4` | `integer` | Yes | | | `ext.rating_distribution.star_5` | `integer` | Yes | | | `ext.store_inventory` | `object[]` | Yes | | | `ext.promotion.label` | `string` | Yes | | | `ext.promotion.amount_off` | `integer` | Yes | | | `ext.promotion.percent_off` | `integer` | Yes | | | `ext.price_note` | `string` | Yes | | | `ext.condition` | `string` | Yes | | | `ext.available_quantity` | `integer` | Yes | | | `ext.watchers` | `integer` | Yes | | | `ext.sold_at` | `string` | Yes | | | `ext.sold_caption` | `string` | Yes | | | `ext.buying_format` | `string` | Yes | | | `ext.seller_reputation.feedback_percentage` | `integer` | Yes | | | `ext.seller_reputation.feedback_count` | `integer` | Yes | | | `ext.seller_reputation.top_rated` | `boolean` | Yes | | | `ext.seller_reputation.items_sold` | `integer` | Yes | | | `ext.seller_reputation.joined` | `string` | Yes | | | `ext.seller_reputation.url` | `string` | Yes | | | `ext.seller_reputation.detailed_ratings.accurate_description` | `integer` | Yes | | | `ext.seller_reputation.detailed_ratings.reasonable_shipping_cost` | `integer` | Yes | | | `ext.seller_reputation.detailed_ratings.shipping_speed` | `integer` | Yes | | | `ext.seller_reputation.detailed_ratings.communication` | `integer` | Yes | | | `ext.g2` | `string` | Yes | | | `ext.etsy` | `string` | Yes | | | `ext.sephora` | `string` | Yes | | | `ext.hm` | `string` | Yes | | | `ext.kohls` | `string` | Yes | | | `ext.gumtree` | `string` | Yes | | | `ext.sku_id` | `string` | Yes | | | `ext.aliexpress` | `string` | Yes | | | `ext.tiktokshop` | `string` | Yes | | ## Platform availability 16 platforms return the `Product` shape. `id` are never null on any platform. The fields below vary: **yes** means the platform populates it (the value may still be null); a blank means the platform never provides it, so it is always null.