CompSniper Docs

Grailed Sold Listings API

Get Grailed sold prices (what buyers actually paid), sold dates, shipping, size and condition, plus active listings, with one CompSniper API key.

CompSniper has two Grailed endpoints for menswear, womenswear, streetwear and designer resale:

EndpointWhat you get
GET /v1/grailed/soldSold listings with the price the buyer paid, sold date, shipping, size, condition and designer
GET /v1/grailed/listingsActive listings with asking price, US shipping, offers, size, condition and designer

Both use the same API key, per-minute limit, monthly allowance and purchased credits as the eBay endpoints. No Grailed account is needed.

soldPrice is the price the buyer actually paid. When a buyer's offer was accepted, soldPrice is the accepted offer and listPrice is the asking price it sold from, so you price against real sales, not asking prices.

For an overview with code in cURL, Python and JavaScript, see the Grailed API page.

Sold listings

curl --fail-with-body \
  -H "Authorization: Bearer cs_live_REPLACEWITHYOURKEY" \
  "https://api.compsniper.com/v1/grailed/sold?keyword=supreme+box+logo+hoodie&department=menswear&count=40"
Python
import requests

response = requests.get(
    "https://api.compsniper.com/v1/grailed/sold",
    headers={"Authorization": "Bearer cs_live_REPLACEWITHYOURKEY"},
    params={"keyword": "arcteryx beta ar", "department": "menswear", "condition": "gently_used", "count": 100},
    timeout=45,
)
response.raise_for_status()
data = response.json()
print(data["totalResults"], "sales, median", data["summary"]["median"])
for sale in data["items"][:5]:
    print(sale["soldAt"][:10], sale["size"], sale["condition"], sale["soldPrice"], sale["shippingPrice"])

Parameters

ParameterValuesDefault
keywordBrand, model and item, up to 300 charactersRequired
departmentany, menswear, womenswearany
conditionany, new, gently_used, used, wornany
minPrice, maxPricePrice range in USD (sold price on /sold, asking price on /listings)None
sortBySold: recent, price_desc, price_asc. Listings: default, newest, price_asc, price_descrecent / default
count1 to 100 rows per page40
page1 and up, while page x count stays at or under 10001

A search returns up to 1,000 rows in total across its pages. For more, narrow it with department, condition or a price range.

Sold response

Example response (shortened)
{
  "keyword": "supreme box logo hoodie",
  "page": 1,
  "count": 40,
  "marketplace": "grailed",
  "totalResults": 7004,
  "totalItems": 40,
  "hasNextPage": true,
  "items": [
    {
      "listingId": "107710313",
      "url": "https://www.grailed.com/listings/107710313",
      "title": "Pink Supreme Box Logo Hoodie",
      "soldPrice": 175,
      "listPrice": 211,
      "shippingPrice": 14.99,
      "soldPriceIncludesShipping": false,
      "currency": "USD",
      "soldAt": "2026-10-18T01:48:11.810Z",
      "designers": ["Supreme"],
      "size": "m",
      "condition": "Gently used",
      "category": "tops.sweatshirts_hoodies",
      "department": "menswear",
      "location": "United States",
      "imageUrl": "https://media-assets.grailed.com/..."
    }
  ],
  "summary": { "count": 40, "currency": "USD", "median": 200, "mean": 214.3, "min": 120, "max": 410, "p25": 180, "p75": 240, "avgShipping": null },
  "scrapedAt": "2026-10-18T02:10:04.122Z"
}
  • totalResults is how many Grailed sales match the search; items holds this page.
  • shippingPrice is the shipping the buyer paid. soldPriceIncludesShipping says whether soldPrice already includes it.
  • condition is one of New, Gently used, Used or Very worn.
  • summary holds the count, median, mean, min, max, p25 and p75 of the returned sold prices.

Active listings

curl --fail-with-body \
  -H "Authorization: Bearer cs_live_REPLACEWITHYOURKEY" \
  "https://api.compsniper.com/v1/grailed/listings?keyword=rick+owens+geobasket&sortBy=newest&count=40"

Each listing has listingId, url, title, price, shippingPrice (US shipping when offered), acceptsOffers, designers, size, condition, category, department, location, imageUrl, listedAt and bumpedAt. The response includes totalListings and hasNextPage for paging, and a summary of the asking prices.

Billing

  • One successful call is one request, for sold and listings alike.
  • Failed requests are free.
  • Repeat calls can return instantly from a short-lived saved copy and count as one request.

Errors

The Grailed endpoints use the shared error format (code, error, requestId):

StatusCodeMeaningWhat to do
400invalid_paramsMissing keyword, a value out of range, or page x count over 1,000Fix the request
429rate_limited / quota_exceededPer-minute limit or monthly allowance reachedSee Rate limits
502, 503upstream_blocked / server_busyGrailed did not answer this timeRetry after a few seconds, with a bound

See Errors for the full list.

On this page