{
  "object": "doc",
  "title": "Get a product: GET /api/v1/products/{id}",
  "description": "One product with specs, every retailer offer, coupons and a price verdict.",
  "section": "API reference",
  "url": "https://cart-route.com/docs/api/products",
  "updated": "2026-09-23",
  "prev": "https://cart-route.com/docs/api/search",
  "next": "https://cart-route.com/docs/api/price-history",
  "text": "`GET /api/v1/products/{id}` returns one product with its specifications, every retailer offer, the coupons that apply to each offer and a 90-day price verdict. `{id}` may be a product id (`prd_...`), the slug, the GTIN or the MPN. Costs 1 credit.\n\nGET https://cart-route.com/api/v1/products/{id}\n\n## Which identifiers can I pass?\n\n| Form | Example |\n\n| Product id | `prd_0dophw3` |\n\n| Slug | `sony-wh-1000xm6` |\n\n| GTIN | `00027242928138` |\n\n| MPN | `WH1000XM6/B` |\n\nProduct ids are stable. Slugs are stable too, but store the id if you persist references.\n\n## What does a request look like?\n\n```\ncurl \"https://cart-route.com/api/v1/products/sony-wh-1000xm6\" \\\n  -H \"Authorization: Bearer $CARTROUTE_API_KEY\"\n```\n\n## What does the response contain?\n\n`{ \"object\": \"product\", \"product\": { ... }, \"credits\": { ... } }`. The product has every field of [the product object](https://cart-route.com/docs/objects#product) plus `specs`, a flat object of display-ready strings. Offers are sorted by effective price, cheapest first.\n\n```\n{\n  \"object\": \"product\",\n  \"data_source\": \"sandbox\",\n  \"product\": {\n    \"object\": \"product\",\n    \"id\": \"prd_0dophw3\",\n    \"slug\": \"sony-wh-1000xm6\",\n    \"title\": \"Sony WH-1000XM6 Wireless Noise Cancelling Headphones\",\n    \"brand\": \"Sony\",\n    \"category\": \"Audio\",\n    \"subcategory\": \"Headphones\",\n    \"identifiers\": {\n      \"gtin\": \"00027242928138\",\n      \"mpn\": \"WH1000XM6/B\",\n      \"model\": \"WH-1000XM6\"\n    },\n    \"rating\": 4.6,\n    \"review_count\": 6720,\n    \"released_on\": \"2026-05-15\",\n    \"summary\": \"The XM6 restores the folding hinge the XM5 dropped and adds a 12-microphone array. Street price settles roughly 15% below MSRP within four months of launch, and Costco bundles a hard case at the same price point.\",\n    \"url\": \"https://cart-route.com/p/sony-wh-1000xm6\",\n    \"price_summary\": {\n      \"best_offer_id\": \"off_1piefxe\",\n      \"best_retailer\": \"Newegg\",\n      \"best_effective_price_usd\": 343.99,\n      \"lowest_price_usd\": 343.99,\n      \"highest_price_usd\": 454.99,\n      \"spread_usd\": 111,\n      \"offers_count\": 7,\n      \"in_stock_count\": 6,\n      \"coupons_count\": 4\n    },\n    \"price_insight\": {\n      \"verdict\": \"good_time_to_buy\",\n      \"reason\": \"Current lowest price is at or within 1% of the 90-day low of $342.99.\",\n      \"low_90d_usd\": 342.99,\n      \"high_90d_usd\": 431.99,\n      \"avg_30d_usd\": 372.72,\n      \"trend_30d_pct\": -3.4,\n      \"is_at_90d_low\": true,\n      \"observations\": 91\n    },\n    \"offers\": [\n      {\n        \"offer_id\": \"off_1piefxe\",\n        \"retailer\": {\n          \"id\": \"newegg\",\n          \"name\": \"Newegg\",\n          \"domain\": \"newegg.com\",\n          \"membership_required\": false,\n          \"returns_window_days\": 30\n        },\n        \"sku\": \"N82E16877620928\",\n        \"condition\": \"new\",\n        \"seller\": \"Newegg\",\n        \"price_usd\": 343.99,\n        \"list_price_usd\": 449.99,\n        \"discount_from_list_pct\": 23.6,\n        \"shipping_usd\": 0,\n        \"landed_price_usd\": 343.99,\n        \"best_coupon\": null,\n        \"effective_price_usd\": 343.99,\n        \"coupons\": [],\n        \"availability\": {\n          \"in_stock\": true,\n          \"stock_level\": \"in_stock\",\n          \"delivery_days_min\": 3,\n          \"delivery_days_max\": 6,\n          \"store_pickup\": false\n        },\n        \"retailer_url\": \"https://www.newegg.com/p/pl?d=Sony+WH-1000XM6\",\n        \"buy_url\": \"https://cart-route.com/go/off_1piefxe\",\n        \"last_checked_at\": \"2026-09-23T13:29:33.558Z\",\n        \"freshness_seconds\": 869\n      }\n    ],\n    \"specs\": {\n      \"Drivers\": \"30mm carbon fibre composite\",\n      \"Battery\": \"30 hours ANC on, 3 min charge for 3 hours\",\n      \"Weight\": \"254 g\"\n    }\n  },\n  \"credits\": {\n    \"charged\": 1,\n    \"remaining\": 198\n  }\n}\n```\n\n## When should I use this instead of search?\n\nWhen you already know the product (a user pasted a model number or a previous search returned its id) and you want the full offer list and specs. Search returns up to every offer too, but omits specs and costs the same, so fetching by id is the precise choice.\n\n## Which errors can it return?\n\n`404 not_found` when no product matches the identifier (not charged), plus the common `401`, `402` and `429`."
}