Sandbox environment: prices, stock and coupons are synthetic test data. What this means

Get a product: GET /api/v1/products/{id}

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.

GET https://cart-route.com/api/v1/products/{id}

Which identifiers can I pass?

FormExample
Product idprd_0dophw3
Slugsony-wh-1000xm6
GTIN00027242928138
MPNWH1000XM6/B

Product ids are stable. Slugs are stable too, but store the id if you persist references.

What does a request look like?

curl "https://cart-route.com/api/v1/products/sony-wh-1000xm6" \
  -H "Authorization: Bearer $CARTROUTE_API_KEY"

What does the response contain?

{ "object": "product", "product": { ... }, "credits": { ... } }. The product has every field of the product object plus specs, a flat object of display-ready strings. Offers are sorted by effective price, cheapest first.

{
  "object": "product",
  "data_source": "sandbox",
  "product": {
    "object": "product",
    "id": "prd_0dophw3",
    "slug": "sony-wh-1000xm6",
    "title": "Sony WH-1000XM6 Wireless Noise Cancelling Headphones",
    "brand": "Sony",
    "category": "Audio",
    "subcategory": "Headphones",
    "identifiers": {
      "gtin": "00027242928138",
      "mpn": "WH1000XM6/B",
      "model": "WH-1000XM6"
    },
    "rating": 4.6,
    "review_count": 6720,
    "released_on": "2026-05-15",
    "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.",
    "url": "https://cart-route.com/p/sony-wh-1000xm6",
    "price_summary": {
      "best_offer_id": "off_1piefxe",
      "best_retailer": "Newegg",
      "best_effective_price_usd": 343.99,
      "lowest_price_usd": 343.99,
      "highest_price_usd": 454.99,
      "spread_usd": 111,
      "offers_count": 7,
      "in_stock_count": 6,
      "coupons_count": 4
    },
    "price_insight": {
      "verdict": "good_time_to_buy",
      "reason": "Current lowest price is at or within 1% of the 90-day low of $342.99.",
      "low_90d_usd": 342.99,
      "high_90d_usd": 431.99,
      "avg_30d_usd": 372.72,
      "trend_30d_pct": -3.4,
      "is_at_90d_low": true,
      "observations": 91
    },
    "offers": [
      {
        "offer_id": "off_1piefxe",
        "retailer": {
          "id": "newegg",
          "name": "Newegg",
          "domain": "newegg.com",
          "membership_required": false,
          "returns_window_days": 30
        },
        "sku": "N82E16877620928",
        "condition": "new",
        "seller": "Newegg",
        "price_usd": 343.99,
        "list_price_usd": 449.99,
        "discount_from_list_pct": 23.6,
        "shipping_usd": 0,
        "landed_price_usd": 343.99,
        "best_coupon": null,
        "effective_price_usd": 343.99,
        "coupons": [],
        "availability": {
          "in_stock": true,
          "stock_level": "in_stock",
          "delivery_days_min": 3,
          "delivery_days_max": 6,
          "store_pickup": false
        },
        "retailer_url": "https://www.newegg.com/p/pl?d=Sony+WH-1000XM6",
        "buy_url": "https://cart-route.com/go/off_1piefxe",
        "last_checked_at": "2026-09-23T12:32:01.025Z",
        "freshness_seconds": 995
      }
    ],
    "specs": {
      "Drivers": "30mm carbon fibre composite",
      "Battery": "30 hours ANC on, 3 min charge for 3 hours",
      "Weight": "254 g"
    }
  },
  "credits": {
    "charged": 1,
    "remaining": 198
  }
}

When should I use this instead of search?

When 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.

Which errors can it return?

404 not_found when no product matches the identifier (not charged), plus the common 401, 402 and 429.