Get the deals feed

Last updated · Changelog · OpenAPI spec · Markdown

Retrieve a feed of current shopping deals with Reddit-style sorting, filtering, and pagination. Each deal includes an expert grade (A+ through F), pricing, retailer info, community votes, and more.

Endpoint: GET /v1/deals

Credit Cost: 1 credit per 10 deals returned

Parameters:

ParameterTypeDefaultDescription
sortstringhotSort algorithm: hot, new, top-hour, top-day, top-week
limitnumber25Results per page (1-100)
offsetnumber0Pagination offset
categorystringFilter by product category
retailerstringFilter by retailer domain (e.g., amazon.com)
tagstringFilter by deal tag
min_pricenumberMinimum deal price
max_pricenumberMaximum deal price
gradestringMinimum grade: A, B, C, D
formatstringjsonResponse format: json or csv

Boolean Filters (set to true to filter): is_percentage_off, is_dollar_off, is_bogo, is_price_drop, is_free_shipping, is_fast_shipping, is_limited_time, is_clearance, is_new_product, is_bundle, is_refurbished, is_open_box, requires_membership, has_coupon_code, has_mail_in_rebate

Example Request:

curl -X GET 'https://api.shopsavvy.com/v1/deals?sort=hot&limit=10&grade=B' \
  -H 'Authorization: Bearer YOUR_API_KEY'

Example Response:

{
  "success": true,
  "deals": [
    {
      "path": "deals/abc123",
      "title": "Sony WH-1000XM5 Wireless Headphones - 25% Off",
      "subtitle": "Lowest price in 3 months",
      "description": "Industry-leading noise cancellation headphones at a rare discount...",
      "emoji": "🎧",
      "grade": { "letter": "A", "suffix": "+", "value": 0.98, "justification": "Excellent price on a top-rated product" },
      "pricing": { "current": 248.00, "original": 349.99, "currency": "USD" },
      "retailer": { "name": "Amazon" },
      "url": "https://...",
      "image": { "url": "https://..." },
      "votes": {
        "upvotes": 142,
        "downvotes": 3,
        "score": 139,
        "upvotes_internal": 6,
        "downvotes_internal": 1,
        "score_internal": 5,
        "upvotes_external": 136,
        "downvotes_external": 2,
        "score_external": 134
      },
      "comment_count": 23,
      "comment_count_community": 2,
      "tags": [{ "slug": "electronics", "display": "Electronics" }],
      "expires_at": "2026-04-15T00:00:00Z",
      "created_at": "2026-03-28T12:00:00Z"
    }
  ],
  "pagination": { "total": 487, "has_more": true, "limit": 10, "offset": 0 },
  "meta": { "request_id": "abc-123", "credits_used": 1, "credits_remaining": 999 }
}

Vote and comment provenance

Deals reach ShopSavvy two ways: posted by ShopSavvy users, and imported from public deal communities. Engagement numbers on an imported deal carry over from its source, so the top-level totals mix both populations. Read the breakdown when you need one or the other:

FieldMeaning
votes.upvotes / downvotes / scoreCombined totals. Equals internal + external.
votes.upvotes_internal / downvotes_internal / score_internalVotes cast by ShopSavvy accounts only.
votes.upvotes_external / downvotes_external / score_externalEngagement carried over from the deal's source at import time.
comment_countEvery comment on the deal thread.
comment_count_communityComments written by ordinary ShopSavvy accounts, excluding ShopSavvy's own editorial personas.

On the current corpus the external component dominates the combined totals by a wide margin, so treat score as "how much attention this deal has attracted anywhere" rather than "how many ShopSavvy users voted." Use score_internal / comment_count_community for the latter. The same split is available in the CSV export as votes_up_internal, votes_down_internal, votes_up_external, votes_down_external, comment_count and comment_count_community.

Was this page helpful?