Grailed
Grailed asking price, original price, sold price and date, designers, size, condition, category, seller and likes, by listing id, about 20 million listings per credit. Sold listings too, in bulk. Search for available or sold listings. No listing rating.
Grailed asking price, original price, sold price and date, designers, size, condition, category, seller and likes, by listing id, about 20 million listings per credit. Sold listings too, in bulk. Search for available or sold listings. No listing rating.
At a glance
Property | Value |
|---|---|
|
|
Item id | The number after |
Marketplaces | Live: |
Tier |
|
Ids per call | 1,000, looked up together: available and sold listings in the same call. |
Typical call | 1–5 s for 1,000 listings |
Search |
|
Asking price versus sold price
price is the asking price: the last price the seller set, also on a sold listing. What a sold listing sold for is grailed.soldPrice, and it can be lower, because an accepted offer sells below the ask (asked 100, sold 60 is a real case). Read grailed.soldPrice, grailed.soldAt and grailed.soldShippingPrice on a sold listing; on an available one they are null.
Original price
grailed.originalPrice is the first price in the listing's price-drop history, and null when the price never dropped (it is not 0). It is the earliest ask the history holds: it is not a retail price and not a claim about a discount.
Search reaches 1,000 listings per query
However large total_results is, a query returns its first 1,000 listings (page 1 to 10, 100 each). To go deeper, split the query with department, condition, min_price / max_price, size and designer. Asking by id has no such limit.
Example
- cURL
- Python
- Node.js
curl -X POST "https://api.scrapelyserp.com/v1/products" \
-H "Authorization: Bearer $SCRAPELY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"platform": "grailed",
"ids": ["111350058", "https://www.grailed.com/listings/103041652-jordan"]
}'import os
import requests
HEADERS = {"Authorization": f"Bearer {os.environ['SCRAPELY_API_KEY']}"}
r = requests.post(
"https://api.scrapelyserp.com/v1/products",
headers=HEADERS,
json={
"platform": "grailed",
"ids": [
"111350058",
"https://www.grailed.com/listings/103041652-jordan",
],
},
timeout=30,
)
r.raise_for_status()
data = r.json()
for p in data["results"]:
print(p["id"], p["status"], (p.get("price") or {}).get("amount"), (p.get("grailed") or {}).get("soldPrice"))const res = await fetch('https://api.scrapelyserp.com/v1/products', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.SCRAPELY_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
platform: 'grailed',
ids: ['111350058', 'https://www.grailed.com/listings/103041652-jordan'],
}),
signal: AbortSignal.timeout(30_000),
});
if (!res.ok) throw new Error((await res.json()).error.code);
const data = await res.json();
for (const p of data.results) console.log(p.id, p.status, p.price?.amount, p.grailed?.soldPrice);Full reference → POST /v1/products
Grailed fields
Besides the common fields, each result carries a grailed object.
Field | Description |
|---|---|
| The asking price, in dollars. |
|
|
|
|
| What a sold listing sold for, when (ISO 8601), and the shipping charged, as Grailed gives it (a charge of 0 stays 0). |
| The first price in the price-drop history; |
| The size as the listing shows it. Free text: |
|
|
| The designers ( |
| The seller's username and the seller's own average rating and number of ratings. These describe the seller, not the listing; |
| The listing link and its cover picture. See the note on links below. |
Not given | A rating or review count for the listing (listings have none), the listing's other pictures, description, measurements and shipping options. |
Listing links
The url is https://www.grailed.com/listings/<id>, built from the id alone. Grailed's own links add a title slug after the id (/listings/111350058-fragment-design-x-union-la); both carry the same id, and a pasted link in either form is accepted.
Statuses on Grailed
partial: Grailed answered without a title. Ask again later.not_found: Grailed has no such listing id, available or sold. A deleted listing is not found.unavailable: no usable answer after retries. Not charged; ask again.