Title100/100
Get product
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Look up one product by slug or Steam ID. Returns null when the product is not found or not available in the region. The record also lists the game's other editions and its DLC, each capped at 10 with a count of the true total; set include_related to false to omit them. See https://www.fanatical.com/for-ai/tools or read the "docs" resource.
The description explains the capability, when to use it, and what to expect.
Inputs97/100
Input documentation gives an agent enough context to populate the arguments.
slug
Product slug. Get from a product URL or a search_products result.
Clear enough to supply this argument.
steam_id
Steam application ID. Use when the Steam ID is known. Editions of one game share a Steam ID, so this returns the base edition. Use slug to get a specific edition.
Clear enough to supply this argument.
region
ISO 3166-1 alpha-2 country code. Default US. Sets availability filtering and local pricing in the currency Fanatical transacts in for that region. Region should always be set to the user's location if known for most accurate availability and pricing.
Clear enough to supply this argument.
include_related
When true, the record carries editions and dlc arrays for the game, each capped at 10, with editions_count and dlc_count giving the true totals. Default true. Set false to omit them and make the response smaller - it saves one indexed query and up to a few thousand tokens on games with many DLC.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
{
"title": "Get product",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}Output schema91/100
The output schema explains the structured result.
View output schema
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"region",
"currency",
"product"
],
"properties": {
"region": {
"type": "string",
"description": "ISO 3166-1 alpha-2 region code this response was resolved for."
},
"product": {
"anyOf": [
{
"type": "object",
"required": [
"product_id",
"slug",
"name",
"short_description",
"url",
"cart_url",
"image",
"vertical_image",
"type",
"in_stock",
"drm",
"price",
"full_price",
"discount_percent",
"sale_slug",
"sale_name",
"promo_label",
"steam_id",
"steam_deck_support",
"steam_machine_support",
"tags",
"developers",
"publishers",
"franchises",
"tags_slugs",
"developers_slugs",
"publishers_slugs",
"franchises_slugs",
"operating_systems",
"vr_support",
"metacritic_score",
"steam_review_score",
"steam_review_score_desc",
"coupon",
"parent",
"in_bundle",
"bundle_tiers",
"bundle_price_messages",
"release_date",
"valid_until",
"last_modified"
],
"properties": {
"dlc": {
"type": "array",
"items": {
"type": "object",
"required": [
"slug",
"name",
"type",
"image",
"url",
"price",
"discount_percent"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"description": "Product page URL with tracking parameters already applied. Use it verbatim when you link to this product."
},
"name": {
"type": "string",
"description": "Product name."
},
"slug": {
"type": "string",
"description": "URL slug. Use with get_product or get_products for the full record."
},
"type": {
"enum": [
"game",
"dlc",
"book",
"comic",
"graphic-novel",
"software",
"elearning",
"audio",
"video",
"bundle",
"game-bundle",
"mystery-bundle",
"book-bundle",
"comic-bundle",
"elearning-bundle",
"software-bundle",
"audio-bundle",
"gift-card"
],
"type": "string",
"description": "Fine-grained product type. Note: search_products.type accepts only \"game\", \"dlc\", or \"bundle\" as input filters; the input \"bundle\" matches the output values \"bundle\", \"game-bundle\" and \"mystery-bundle\" (game-focused bundles only in v1). Book, software, and audio bundles are in the response but not filterable in v1."
},
"image": {
"type": "string",
"format": "uri",
"description": "Cover image URL at 1280x720 landscape. This is the canonical Fanatical cover art. Prefer it over running a separate image search on the product name, which often picks up store-listing screenshots from competitor retailers."
},
"price": {
"anyOf": [
{
"type": "number",
"minimum": 0
},
{
"type": "null"
}
],
"description": "Current price in the region's currency."
},
"discount_percent": {
"type": "integer",
"maximum": 100,
"minimum": 0,
"description": "Discount percent off list price."
}
},
"description": "Compact reference to a related product - another edition of the same game, or one of its DLC. It carries no drm: assume the same DRM as the product that lists it.",
"additionalProperties": false
},
"description": "DLC and add-ons for this game. Capped at 10, ranked by best-seller position; dlc_count is the true total. When dlc_count is above 10, use search_products with the franchise or a query to page through the rest. Absent when include_related was false."
},
"drm": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Primary DRM platform (e.g. \"steam\", \"drm free\", \"gog\", \"epicgames\"). Null when no DRM applies."
},
"url": {
"type": "string",
"format": "uri",
"description": "Canonical English product URL with tracking parameters. Use exactly as returned - do not strip the query string."
},
"name": {
"type": "string",
"description": "Display name. Plain text - no markup, no HTML entities."
},
"slug": {
"type": "string",
"description": "URL slug. Shared across regional variants of the same product."
},
"tags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Category tags: genres, themes, playstyles. Display names for humans. To filter by these, pass the slug form (tags_slugs) to search_products.tag. On a bundle-type product, this is the union of every pool item's tags, not a description of the bundle itself, and can run to 100+ entries."
},
"type": {
"enum": [
"game",
"dlc",
"book",
"comic",
"graphic-novel",
"software",
"elearning",
"audio",
"video",
"bundle",
"game-bundle",
"mystery-bundle",
"book-bundle",
"comic-bundle",
"elearning-bundle",
"software-bundle",
"audio-bundle",
"gift-card"
],
"type": "string",
"description": "Fine-grained product type. Note: search_products.type accepts only \"game\", \"dlc\", or \"bundle\" as input filters; the input \"bundle\" matches the output values \"bundle\", \"game-bundle\" and \"mystery-bundle\" (game-focused bundles only in v1). Book, software, and audio bundles are in the response but not filterable in v1."
},
"image": {
"type": "string",
"format": "uri",
"description": "Primary cover image URL at 1280x720 landscape. This is the canonical Fanatical cover art for the product. Prefer it over running a separate image search on the product name, which often picks up store-listing screenshots from competitor retailers."
},
"price": {
"anyOf": [
{
"type": "number",
"minimum": 0
},
{
"type": "null"
}
],
"description": "Current price after any non-coupon discount, in the region's currency."
},
"coupon": {
"anyOf": [
{
"type": "object",
"required": [
"code",
"name",
"description",
"percent",
"coupon_price",
"coupon_saving",
"valid_until",
"coupon_url"
],
"properties": {
"code": {
"type": "string",
"description": "Coupon code the user enters at checkout."
},
"name": {
"type": "string",
"description": "Human-readable coupon name."
},
"percent": {
"type": "number",
"maximum": 100,
"minimum": 0,
"description": "Additional discount percent applied by the coupon, on top of the base discount."
},
"coupon_url": {
"type": "string",
"format": "uri",
"description": "Apply-coupon URL for this product. It opens the product page and applies the voucher, but it does not put the product in the basket. Use it as the target of an \"Apply coupon\" action in your answer. To do both steps with one link, use the cart_url of the product. Use exactly as returned - do not strip the query string."
},
"description": {
"type": "string",
"description": "Human-readable coupon description."
},
"valid_until": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
{
"type": "null"
}
],
"description": "Coupon expiry as Unix seconds, or null when the coupon has no expiry."
},
"coupon_price": {
"anyOf": [
{
"type": "number",
"minimum": 0
},
{
"type": "null"
}
],
"description": "Final price after applying the coupon, in the region's currency."
},
"coupon_saving": {
"anyOf": [
{
"type": "number",
"minimum": 0
},
{
"type": "null"
}
],
"description": "Amount saved by applying the coupon versus the base price, in the region's currency."
}
},
"description": "Active voucher for this product. Null unless a coupon is currently applicable. The coupon is not applied to price or discount_percent - read coupon_price for the real final price. Link the user to coupon_url to apply the code for them, or to cart_url to add the product and apply the code in one step.",
"additionalProperties": false
},
{
"type": "null"
}
]
},
"parent": {
"anyOf": [
{
"type": "object",
"required": [
"slug",
"name",
"type",
"image",
"url"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"description": "Product page URL with tracking parameters already applied. Use it verbatim when you link to this product."
},
"name": {
"type": "string",
"description": "Product name."
},
"slug": {
"type": "string",
"description": "URL slug. Use with get_product or get_products for the full record."
},
"type": {
"enum": [
"game",
"dlc",
"book",
"comic",
"graphic-novel",
"software",
"elearning",
"audio",
"video",
"bundle",
"game-bundle",
"mystery-bundle",
"book-bundle",
"comic-bundle",
"elearning-bundle",
"software-bundle",
"audio-bundle",
"gift-card"
],
"type": "string",
"description": "Fine-grained product type. Note: search_products.type accepts only \"game\", \"dlc\", or \"bundle\" as input filters; the input \"bundle\" matches the output values \"bundle\", \"game-bundle\" and \"mystery-bundle\" (game-focused bundles only in v1). Book, software, and audio bundles are in the response but not filterable in v1."
},
"image": {
"type": "string",
"format": "uri",
"description": "Cover image URL at 1280x720 landscape. This is the canonical Fanatical cover art. Prefer it over running a separate image search on the product name, which often picks up store-listing screenshots from competitor retailers."
}
},
"description": "Parent product reference. Present when this product is a variant, edition, or DLC of a parent. Absent for standalone products. It carries no drm or price: assume the same DRM as this product, and look the parent up by slug with get_product for its price.",
"additionalProperties": false
},
{
"type": "null"
}
]
},
"cart_url": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
],
"description": "Add-to-cart URL for this product. It opens the product page with the product already in the basket, and with the voucher applied when the product has a coupon. Use it as the target of an \"Add to cart\" action in your answer. Null for a bundle where the customer must select a tier or select which items they want, because one URL cannot give a definite basket - link to url instead. Use exactly as returned - do not strip the query string."
},
"editions": {
"type": "array",
"items": {
"type": "object",
"required": [
"slug",
"name",
"type",
"image",
"url",
"price",
"discount_percent"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"description": "Product page URL with tracking parameters already applied. Use it verbatim when you link to this product."
},
"name": {
"type": "string",
"description": "Product name."
},
"slug": {
"type": "string",
"description": "URL slug. Use with get_product or get_products for the full record."
},
"type": {
"enum": [
"game",
"dlc",
"book",
"comic",
"graphic-novel",
"software",
"elearning",
"audio",
"video",
"bundle",
"game-bundle",
"mystery-bundle",
"book-bundle",
"comic-bundle",
"elearning-bundle",
"software-bundle",
"audio-bundle",
"gift-card"
],
"type": "string",
"description": "Fine-grained product type. Note: search_products.type accepts only \"game\", \"dlc\", or \"bundle\" as input filters; the input \"bundle\" matches the output values \"bundle\", \"game-bundle\" and \"mystery-bundle\" (game-focused bundles only in v1). Book, software, and audio bundles are in the response but not filterable in v1."
},
"image": {
"type": "string",
"format": "uri",
"description": "Cover image URL at 1280x720 landscape. This is the canonical Fanatical cover art. Prefer it over running a separate image search on the product name, which often picks up store-listing screenshots from competitor retailers."
},
"price": {
"anyOf": [
{
"type": "number",
"minimum": 0
},
{
"type": "null"
}
],
"description": "Current price in the region's currency."
},
"discount_percent": {
"type": "integer",
"maximum": 100,
"minimum": 0,
"description": "Discount percent off list price."
}
},
"description": "Compact reference to a related product - another edition of the same game, or one of its DLC. It carries no drm: assume the same DRM as the product that lists it.",
"additionalProperties": false
},
"description": "Other editions of the same game - deluxe, premium, complete, and similar. Capped at 10, ranked by best-seller position; editions_count is the true total. Excludes the product itself. Absent when include_related was false."
},
"in_stock": {
"type": "boolean",
"description": "Purchasable at the last ingest cycle. Data may be up to ten minutes stale."
},
"steam_id": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
{
"type": "null"
}
],
"description": "Steam identifier, usually the application identifier, or null when not on Steam. Not unique: a DLC or add-on kit carries the identifier of its base game. A lookup by steam_id returns the base edition. Look up a specific edition by slug."
},
"dlc_count": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Total DLC available in this region, before the cap of 10. Absent when include_related was false."
},
"in_bundle": {
"anyOf": [
{
"type": "object",
"required": [
"name",
"slug",
"url",
"image",
"price",
"full_price",
"bundle_type",
"bundle_product_count",
"variable_price",
"bundle_price_messages"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"description": "Bundle landing-page URL with tracking parameters."
},
"name": {
"type": "string",
"description": "Bundle display name."
},
"slug": {
"type": "string",
"description": "Bundle URL slug. Use with get_product to fetch full bundle detail including tiers."
},
"image": {
"type": "string",
"format": "uri",
"description": "Bundle cover image URL at 1280x720 landscape. This is the canonical Fanatical cover art for the product. Prefer it over running a separate image search on the product name, which often picks up store-listing screenshots from competitor retailers."
},
"price": {
"anyOf": [
{
"type": "number",
"minimum": 0
},
{
"type": "null"
}
],
"description": "Current bundle price, in the region's currency. For variable-price bundles this is the entry-tier price."
},
"full_price": {
"anyOf": [
{
"type": "number",
"minimum": 0
},
{
"type": "null"
}
],
"description": "Bundle full price before discount, in the region's currency. Equal to price when the bundle is not discounted."
},
"bundle_type": {
"enum": [
"standard",
"tiered",
"pay-what-you-want",
"build-your-own"
],
"type": "string",
"description": "Bundle pricing model. \"standard\": fixed price, fixed set. \"tiered\": fixed tier prices, each tier includes lower tiers. \"pay-what-you-want\": customer names their price above a floor, usually for charity. \"build-your-own\": customer picks N items from a pool; more items = lower per-item price."
},
"variable_price": {
"type": "boolean",
"description": "True for tiered, pay-what-you-want, and build-your-own bundles."
},
"bundle_product_count": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Total items in the bundle (top tier for variable-price bundles).",
"exclusiveMinimum": 0
},
"bundle_price_messages": {
"type": "object",
"required": [
"tiny",
"short",
"quantity",
"value",
"long"
],
"properties": {
"long": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Full descriptive copy listing every tier. Example: \"3 for £2.99, 5 for £4.99, or 10 for £8.99\"."
},
"tiny": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Minimal one-line price pitch. Example: \"5 for £4.99\"."
},
"short": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Short summary of the bundle pricing. Example: \"Get 5 games for £4.99\"."
},
"value": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Value-focused pitch. Example: \"Save 80% with a 5-game pick-and-mix\"."
},
"quantity": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Quantity-focused pitch. Example: \"Any 5 games for £4.99\"."
}
},
"description": "Pre-rendered bundle marketing copy in five lengths, already folded to the region's currency. Use these instead of synthesising a bundle pitch - phrasing is tuned per bundle_type and per length. Null values mean the copy for this currency was not generated.",
"additionalProperties": false
},
"minimum_product_count": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Smallest tier size for tiered and build-your-own bundles.",
"exclusiveMinimum": 0
}
},
"description": "Reference to a bundle this product is currently sold as part of. Present only when the product is in a live bundle. Use bundle_price_messages for a ready-to-quote pitch - an agent recommending this game can name-drop the bundle without synthesising the copy. Products can only be in one bundle at any one time, use get_product to find the full bundle contents.",
"additionalProperties": false
},
{
"type": "null"
}
]
},
"sale_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Human-readable sale event name, or null when sale_slug is null."
},
"sale_slug": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Slug of the curated sale event this product is in, or null when not in a curated sale. A product with sale_slug=null can still be discounted - sale_slug indicates curated sale membership, not the presence of a discount."
},
"developers": {
"type": "array",
"items": {
"type": "string"
},
"description": "Developer studios (display names)."
},
"franchises": {
"type": "array",
"items": {
"type": "string"
},
"description": "Franchises this product belongs to (display names)."
},
"full_price": {
"anyOf": [
{
"type": "number",
"minimum": 0
},
{
"type": "null"
}
],
"description": "Original price before any discount, in the region's currency. Equal to price when not on sale. For pick-and-mix bundles, this is the entry-tier price, not a pre-discount reference - the two are equal by construction. Read discount_percent for the saving against the constituent items' RRP."
},
"product_id": {
"type": "string",
"description": "Internal product identifier. Regional and edition variants have distinct product_ids. Stable while a listing is live; a re-listed product may get a new product_id."
},
"publishers": {
"type": "array",
"items": {
"type": "string"
},
"description": "Publishers (display names)."
},
"tags_slugs": {
"type": "array",
"items": {
"type": "string"
},
"description": "Slug form of tags. Pass to search_products.tag to filter more products with the same tags."
},
"vr_support": {
"type": "array",
"items": {
"type": "string"
},
"description": "VR headset and feature flags. Empty array when the product has no VR support."
},
"promo_label": {
"anyOf": [
{
"enum": [
"star-deal",
"best-ever",
"highlighted-deal",
"flash-sale"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "Highest-priority promotional label. Priority: star-deal > best-ever > highlighted-deal > flash-sale. Only the top applicable label is shown. Absent when no label applies."
},
"valid_until": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
{
"type": "null"
}
],
"description": "When the current price and availability expire, as Unix seconds. Null when open-ended. Includes sale end, coupon end, key stock expiry, or a scheduled price change. Compare to the current time to gauge urgency."
},
"bundle_tiers": {
"anyOf": [
{
"type": "array",
"items": {
"type": "object",
"required": [
"tier_product_count",
"products",
"price"
],
"properties": {
"price": {
"anyOf": [
{
"type": "number",
"minimum": 0
},
{
"type": "null"
}
],
"description": "Price required to unlock this tier, in the region's currency."
},
"products": {
"type": "array",
"items": {
"type": "object",
"required": [
"slug",
"name",
"type",
"image",
"drm",
"full_price"
],
"properties": {
"drm": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Primary DRM platform for this item (e.g. \"steam\", \"drm free\"). Present here because one bundle can mix DRM platforms. Null when unknown."
},
"name": {
"type": "string",
"description": "Product name."
},
"slug": {
"type": "string",
"description": "URL slug. Use with get_product or get_products for the full record."
},
"type": {
"enum": [
"game",
"dlc",
"book",
"comic",
"graphic-novel",
"software",
"elearning",
"audio",
"video",
"bundle",
"game-bundle",
"mystery-bundle",
"book-bundle",
"comic-bundle",
"elearning-bundle",
"software-bundle",
"audio-bundle",
"gift-card"
],
"type": "string",
"description": "Fine-grained product type. Note: search_products.type accepts only \"game\", \"dlc\", or \"bundle\" as input filters; the input \"bundle\" matches the output values \"bundle\", \"game-bundle\" and \"mystery-bundle\" (game-focused bundles only in v1). Book, software, and audio bundles are in the response but not filterable in v1."
},
"image": {
"type": "string",
"format": "uri",
"description": "Cover image URL at 1280x720 landscape. This is the canonical Fanatical cover art. Prefer it over running a separate image search on the product name, which often picks up store-listing screenshots from competitor retailers."
},
"full_price": {
"anyOf": [
{
"type": "number",
"minimum": 0
},
{
"type": "null"
}
],
"description": "List price of this item on its own, in the region's currency. Use it to judge which picks give the most value. Null when the item has no standalone list price - about half of all bundle items are not sold separately. There is deliberately no current price or discount: an item you cannot buy alone has neither."
}
},
"additionalProperties": false
},
"description": "Items available at this tier. For standard and tiered bundles, this is what the tier contains. For pick-and-mix bundles (build-your-own), the pool lives on tier 0 only — tiers 1+ return an empty array and share tier 0's pool. Read tier 0's products in all cases and use tier_product_count to say how many the user gets."
},
"tier_product_count": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Number of items unlocked at this tier. Higher tiers include every item in lower tiers.",
"exclusiveMinimum": 0
}
},
"additionalProperties": false
}
},
{
"type": "null"
}
],
"description": "Tier breakdown for a bundle. Present only when this product is a bundle. Read this alongside bundle_price_messages to describe what the user gets and what it costs."
},
"release_date": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
{
"type": "null"
}
],
"description": "Release date as Unix seconds, or null when undated. May be in the future for preorders."
},
"last_modified": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
{
"type": "null"
}
],
"description": "Internal. Unix seconds of the last change to this product's data. Useful for cache invalidation."
},
"editions_count": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Total editions available in this region, before the cap of 10. Absent when include_related was false."
},
"vertical_image": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
],
"description": "Portrait cover image URL at 600x900. Null when not available. Same guidance as image - this is the canonical portrait cover, prefer it over image search."
},
"developers_slugs": {
"type": "array",
"items": {
"type": "string"
},
"description": "Slug form of developers. Pass to search_products.developer."
},
"discount_percent": {
"type": "integer",
"maximum": 100,
"minimum": 0,
"description": "Percent off list price, 0-100. Zero when not on sale. For pick-and-mix bundles this represents the saving versus RRP of the constituent items."
},
"franchises_slugs": {
"type": "array",
"items": {
"type": "string"
},
"description": "Slug form of franchises. Pass to search_products.franchise."
},
"metacritic_score": {
"anyOf": [
{
"anyOf": [
{
"type": "number"
},
{
"type": "string"
}
]
},
{
"type": "null"
}
],
"description": "Metacritic score. Number when available; some source records provide it as a string. Null when no score."
},
"publishers_slugs": {
"type": "array",
"items": {
"type": "string"
},
"description": "Slug form of publishers. Pass to search_products.publisher."
},
"operating_systems": {
"type": "array",
"items": {
"enum": [
"windows",
"mac",
"linux",
"xbox series",
"xbox one"
],
"type": "string"
},
"description": "Supported operating systems. Multiple entries when the product supports several."
},
"short_description": {
"type": "string",
"description": "Plain-text summary, up to ~240 characters. No markup, no HTML entities. Line breaks are newline characters. Falls back to a truncated full description when no short description is set."
},
"steam_deck_support": {
"anyOf": [
{
"enum": [
"verified",
"playable",
"unsupported"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "Valve's Steam Deck compatibility rating, or null when Valve has not rated the product."
},
"steam_review_score": {
"anyOf": [
{
"anyOf": [
{
"type": "number"
},
{
"type": "string"
}
]
},
{
"type": "null"
}
],
"description": "Steam review score on a 1 to 9 scale, not a percentage: 1 is \"Overwhelmingly Negative\", 5 \"Mixed\", 8 \"Very Positive\", 9 \"Overwhelmingly Positive\". 0 means either that Steam has too few reviews to rate the product, or that this listing has no review data of its own. Usually a string; some source records provide it as a number. Null when the product has no Steam review data."
},
"bundle_price_messages": {
"anyOf": [
{
"type": "object",
"required": [
"tiny",
"short",
"quantity",
"value",
"long"
],
"properties": {
"long": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Full descriptive copy listing every tier. Example: \"3 for £2.99, 5 for £4.99, or 10 for £8.99\"."
},
"tiny": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Minimal one-line price pitch. Example: \"5 for £4.99\"."
},
"short": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Short summary of the bundle pricing. Example: \"Get 5 games for £4.99\"."
},
"value": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Value-focused pitch. Example: \"Save 80% with a 5-game pick-and-mix\"."
},
"quantity": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Quantity-focused pitch. Example: \"Any 5 games for £4.99\"."
}
},
"description": "Pre-rendered bundle marketing copy in five lengths, already folded to the region's currency. Use these instead of synthesising a bundle pitch - phrasing is tuned per bundle_type and per length. Null values mean the copy for this currency was not generated.",
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Pre-rendered pitch copy for this bundle, folded to the region's currency. Use verbatim."
},
"steam_machine_support": {
"anyOf": [
{
"enum": [
"verified",
"playable",
"unsupported"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "Valve's Steam Machine compatibility rating, same semantics as steam_deck_support."
},
"steam_review_score_desc": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Steam review label for steam_review_score, e.g. \"Very Positive\", \"Overwhelmingly Positive\". When the score is 0, the label gives the review count instead, e.g. \"No user reviews\" or \"3 user reviews\". Null when the product has no Steam review data."
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The requested product, or null when not found or not available in the region."
},
"currency": {
"type": "string",
"description": "ISO 4217 currency code used for every monetary field in this response."
}
},
"additionalProperties": false
}