Skip to content
TrackPin developers

API reference

Deals

GET/v1/deals

Products priced below their normal price, with the website's filters. Includes recently ended deals.

1 request per callTry it

Parameters

  • state
    one oflivearchive
    Default
    live

    archive = deals that ended in the last 14 days.

  • min_discount
    number, range 0–100
    Default
    5

    Minimum % below normal.

  • max_discount
    number, range 0–100

    Maximum % below normal.

  • category
    string
    Example
    Kitchen

    Raw category group, e.g. Kitchen, CE.

  • min_price_cents
    integer, range ≥ 0

    Live: current price. Archive: deal price.

  • max_price_cents
    integer, range ≥ 0

    Live: current price. Archive: deal price.

  • in_stock
    0 | 1
    Default
    0

    1 = only products in stock at the last check.

  • seen_within_hours
    integer, range ≥ 1

    Live only: price seen within this many hours.

  • min_rating
    number, range 0–5

    Minimum star rating.

  • min_reviews
    integer, range ≥ 0

    Minimum number of ratings.

  • min_history_days
    integer, range ≥ 0

    Tracked for at least this many days. Every deal has at least 14.

  • lowest_seen
    0 | 1
    Default
    0

    Live only: 1 = at (within 1% of) the lowest price of the last 45 days.

  • include_suspect
    0 | 1
    Default
    0

    1 = include prices under $1 or more than 90% below normal (likely listing errors).

  • sort
    one ofdiscountsavingpricerecent
    Default
    discount

    Archive always sorts by end time.

  • limit
    integer, range 1–200
    Default
    50

    Rows per page, max 200.

  • cursor
    string

    From next_cursor.

Response

A JSON object. Money is integer cents (USD) and times are milliseconds since the Unix epoch. Fields marked nullable can be null.

  • stateone oflivearchive

    Echoes the request.

  • min_discountnumber

    Echoes the minimum discount applied.

  • countinteger

    Rows in this page.

  • total_cappedboolean

    True when more rows matched than the 4,000-row working set; narrow the filters to see others.

  • next_cursorstringnullable

    Pass as cursor for the next page. Null on the last page.

  • deals[].asinstring

    ASIN.

  • deals[].titlestringnullable

    Title.

  • deals[].imagestringnullable

    Image URL.

  • deals[].ratingnumbernullable

    Star rating.

  • deals[].review_countintegernullable

    Number of ratings.

  • deals[].categorystringnullable

    Raw category group.

  • deals[].category_labelstringnullable

    Readable category name.

  • deals[].in_stockbooleannullable

    Availability at the last check.

  • deals[].current_centsintegernullable

    Current price.

  • deals[].reference_centsintegernullable

    Normal price.

  • deals[].discount_pctnumbernullable

    Percent below normal. Archive rows: the discount while the deal ran.

  • deals[].seen_atintegernullable

    When the current price was last seen.

  • deals[].verdict.labelone ofgreatgoodnormal

    great at 20%+ below normal, good at 5–20%, normal under 5% (only when min_discount is below 5). Archive rows: the label the deal had while it ran, not today's.

  • deals[].verdict.pct_vs_normalnumbernullable

    Same as discount_pct.

  • deals[].listing_claimobjectnullable

    {label, claimed_pct} when the listing shows a crossed-out price for the current price.

  • deals[].was_centsintegernullable

    Archive only: the deal price.

  • deals[].ended_atintegernullable

    Archive only: when the deal ended.

  • deals[].suspectboolean

    Only with include_suspect=1: present and true on likely listing errors (under $1, or more than 90% below normal). Absent on every other row.

Notes

  • Deals need at least 14 days of history: there's no verdict before that.
  • Results come from a working set of the top 4,000 rows by the chosen sort; total_capped tells you when that cut applied.
  • Calls count toward your key's per-minute ceiling (Free 60, Pro 300, Business 1,200 calls a minute), and deals calls have their own: 60 a minute (30 on Free). A call over either gets 429 rate limit exceeded and isn't charged.
  • Each call with a valid key counts as one request against your daily quota, even if the request then fails. A call turned away by a per-minute ceiling (429 rate limit exceeded) doesn't count.

Errors

  • 401missing api key

    No key sent.

  • 401invalid api key

    Unknown or revoked key.

  • 405method not allowed

    The data endpoints are GET only. The Allow header lists the methods an endpoint answers: GET, HEAD and OPTIONS (POST and OPTIONS for /v1/keys/rotate).

  • 429rate limit exceeded

    More than your plan's per-minute ceiling; wait Retry-After seconds. Not charged. The body adds limit, window_s and retry_after_s.

  • 429daily quota exceeded

    Over today's quota. The body adds limit and used.

  • 500internal error

    Something failed on our side, not in your request.

  • 503temporarily unavailable

    Our database can't be reached right now. Retry after the number of seconds in the Retry-After header.

Error bodies are {"error": string}. A daily-quota 429 adds limit and used; a per-minute 429 adds limit, window_s and retry_after_s, with a Retry-After header. See Errors and Quotas.

Try it

Send a real request from this page with your key. It goes from your browser straight to TrackPin.

Stays in this tab's session storage until you close the tab. Never added to a URL.

Parameters

archive = deals that ended in the last 14 days.

Minimum % below normal.

Raw category group, e.g. Kitchen, CE.

1 = only products in stock at the last check.

Archive always sorts by end time.

Rows per page, max 200.

More parameters10

Maximum % below normal.

Live: current price. Archive: deal price.

Live: current price. Archive: deal price.

Live only: price seen within this many hours.

Minimum star rating.

Minimum number of ratings.

Tracked for at least this many days. Every deal has at least 14.

Live only: 1 = at (within 1% of) the lowest price of the last 45 days.

1 = include prices under $1 or more than 90% below normal (likely listing errors).

From next_cursor.

Request

GET /api/v1/deals?limit=5

x-api-key: pk_…

This uses one request from your daily quota.

Response

Send a request to see the status, headers and body here.

Early access.

Free keys are emailed straight away; Pro and Business are bought by card through Stripe. Request an API key