Dick's Sporting Goods
Dick's Sporting Goods price, regular price and online stock for each sku (one colour and size), with colour, size, brand and style, about 4.5 million skus per credit. A store tier adds units in nearby stores and the ZIP's same-day quantity. Search with ratings too.
Dick's Sporting Goods price, regular price and online stock for each sku (one colour and size), with colour, size, brand and style, about 4.5 million skus per credit. A store tier adds units in nearby stores and the ZIP's same-day quantity. Search with ratings too.
At a glance
Property | Value |
|---|---|
|
|
Item id | The sku: 8 digits, one colour and one size ( |
Marketplaces | Live: |
Tiers |
|
Ids per call | 1,000 |
Typical call | 3–8 s for 1,000 ids |
Search |
|
Stock is the online pool only
availability is how many units Dick's has to ship online for that sku. Sold out is inStock: false with onlineQuantity: 0. Some made-to-order items (custom clubs, for one) show a huge pool; there inStock is true and onlineQuantity is null, because the figure is a ceiling, not a count. A sku Dick's gives no stock figure for has no availability at all. Store stock and same-day need the store tier (below).
One sku, one price
price is the price of that colour and size, which can differ from its siblings (a sale on one colour). dicks.listPrice is the regular price when the sku is marked down. Prices are Dick's online prices; a store cannot be chosen for the price.
Ratings are in search, not here
Dick's product data has no rating, so dicks.rating and dicks.reviewCount are always null on a lookup. Search results carry Dick's own rating and review count (null when unrated): take them from there.
Example
This asks for the store tier: the three stores nearest to a ZIP, and that ZIP's same-day quantity. Leave out tier (and the store fields) for the standard tier, which is just price and online stock.
- 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": "dicks",
"tier": "store",
"zip": "08901",
"ids": ["28503237", "28503253"]
}'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": "dicks",
"tier": "store",
"zip": "08901",
"ids": ["28503237", "28503253"],
},
timeout=30,
)
r.raise_for_status()
data = r.json()
for p in data["results"]:
d = p.get("dicks", {})
print(p["id"], p["status"], [(s["storeId"], s["qty"]) for s in d.get("storeStock", [])], d.get("sameDayQty"), d.get("stockAsOf"))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: 'dicks',
tier: 'store',
zip: '08901',
ids: ['28503237', '28503253'],
}),
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.dicks?.storeStock?.map((s) => [s.storeId, s.qty]), p.dicks?.sameDayQty, p.dicks?.stockAsOf);Full reference → POST /v1/products
Store stock tier
tier: "store" adds, to each sku the standard tier would return, the units on hand in nearby Dick's stores and the ZIP's same-day quantity. It costs about 4 million skus per credit (an estimate), against about 4.5 million for standard. Everything in standard, plus units on hand in the nearest stores to a ZIP (or stores you name), when those counts were taken, and the ZIP's same-day quantity.
Parameter | Description |
|---|---|
| Required with this tier: a US ZIP code as 5 digits in a string ( |
| Miles around the ZIP to look for stores. Default 25, at most 50. |
| How many of the nearest stores to report, 1 to 5. Default 3. Fewer stores than asked come back when fewer are inside the radius. |
| Instead of |
Field | Description |
|---|---|
|
|
| The date ( |
| The same-day quantity Dick's gives for the ZIP. |
A 0 can mean no record
Dick's lists a store only when it has stock for the sku, so a store with none shows qty: 0. That is a real zero for most skus, but it can also mean Dick's has no stock record for that sku in that store (made-to-order and some other items never have one). Read 0 as "none on hand that we can see".
Same-day is one store per ZIP
sameDayQty is geographic: Dick's answers it for the ZIP, from one store that serves it. That store is not named, and it is not always the nearest, so the figure need not match any of the storeStock rows. The same-day eligible flag Dick's also sends is true for nearly every sku and is not reported.
A store count at or above 10,000 would be a placeholder pool rather than a count, and is returned as null. We have not seen one in store counts, so this rule is untested.
Dick's fields
Besides the common fields, each result carries a dicks object.
Field | Description |
|---|---|
| The sku's price. |
|
|
| The style the sku belongs to: every colour and size of a product shares it. Group skus by it. |
| The sku's own choices as Dick's names them, for example |
| Dick's regular price, when the sku is marked down. |
| Units available online. |
| Only with |
|
|
| Always |
| The product page of the style (it opens on the product, not on this colour or size). Dick's product pages refuse plain scripted fetches, so open them in a browser. |
Not given | Images, pickup details and delivery windows, and the other sizes of the product (ask for each sku, or take the skus from your own list). |
Search lists one result per style, in the colour Dick's shows, and its id is that colour's sku in one size. To read other sizes or colours, send their skus.
Statuses on Dick's
partial: Dick's answered without a title or style. Ask again later.not_found: Dick's has no such sku.unavailable: no usable answer after retries. Not charged; ask again. With the store tier it also means the ZIP has no stores, or the store counts for that sku could not be read.