Stockx is one of the biggest fashion markets in the US offers a unique take on stock-like trading
experience for wearables. This makes it an important web scraping target as it contains
value pricing data.
Stockx.com is using proprietary web scraping protection technology in combination with
PerimeterX, Akamai and Cloudflare anti-bot services.
This makes it difficult to scrape StockX data reliably and this is where web scraping APIs come in handy.
Overall, most web scraping APIs we've tested through our benchmarks
perform well for StockX.com at $3.85 per 1,000 scrape requests on average.
Stockx.com scraping API benchmarks
Scrapeway runs weekly benchmarks for Stockx Products for the most popular web scraping APIs.
Here's the table for this week:
StockX is one of the easiest targets to scrape as it's a highly dynamic javascript
application that stores all of its data in JSON format which means
headless browser use is not required.
That being said, StockX.com has a lot of anti-scraping technologies in place, so it's recommended to use
a reliable web scraping service that can bypass the constantly changing anti-scraping measures.
See benchmarks for the most up-to-date results.
StockX's HTML datasets contain their data in JSON variables under NextJS framework variables like
__NEXT_DATA__ and can be easily extracted for full product datasets.
Stockx.com scraper
importjsonfromparselimportSelector# install using `pip install zenrows`fromzenrowsimportZenRowsClient# create an API client instanceclient=ZenRowsClient(apikey="YOUR API KEY")# create scrape function that returns HTML parser for a given URLdefscrape(url:str,country:str="",render_js=False,headers:dict=None)->Selector:api_result=client.get(url,headers=headers,params={"json_response":"True","premium_proxy":"True","js_render":"True",})assertapi_result.ok,api_result.textdata=api_result.json()returnSelector(data['html'])url="https://stockx.com/air-jordan-4-retro-military-blue-2024"selector=scrape(url)# The entire dataset can be found in a javascript variable:data=selector.css("script#__NEXT_DATA__::text").get()data=json.loads(data)# full dataset is huge but can be reduced using jsonpath:fromjsonpath_ngimportparseproducts=[]forproductinparse("$..product").find(data):products.append(product.value)print(len(products))# the resulting dataset is pretty big but here are some example fields:frompprintimportpprintpprint(products[0]){"listingType":"STANDARD","gender":"men","browseVerticals":["sneakers"],"primaryTitle":"Jordan 4 Retro","secondaryTitle":"Military Blue (2024)","description":"The Air Jordan 4 Retro Military Blue 2024 stands as a beacon of Jordan Brand's innovation and style. It features an off-white leather base contrasted with the striking military blue splashed on the eyelet wings, heel, and parts of the midsole, creating a look of disciplined yet daring design. The neutral grey touches on the forefoot and outsole balance the aesthetic, highlighting the sneaker's clean lines and geometric shapes.<br><br>Every detail is meticulously crafted, with the Jumpman logo on the tongue, the 'Flight' script on the tongue's underside, and a visible Air-Sole unit encased in the sole—all of which are hallmarks of the Jordan brand's dedication to quality and performance. The industrial blue mesh inserts not only offer breathability but also complement the sneaker's color scheme, adding both function and flair. The beloved Nike Air logo graces the heel and stays true to the original 1989 iteration.<br><br>Released on May 4, 2024, at a retail price of $215, the Air Jordan 4 Retro Military Blue quickly ascended to iconic status. Collectors and sneaker enthusiasts eagerly celebrated the revival of the military blue colorway on a timeless model.","condition":"New","productCategory":"sneakers","editionType":null,"title":"Jordan 4 Retro Military Blue (2024)","media":{"imageUrl":"https://images.stockx.com/images/Air-Jordan-4-Retro-Military-Blue-2024-Product.jpg?fit=fill&bg=FFFFFF&w=700&h=500&fm=webp&auto=compress&q=90&dpr=2&trim=color&updated_at=1713464187","all360Images":["https://images.stockx.com/360/Air-Jordan-4-Retro-Military-Blue-2024/Images/Air-Jordan-4-Retro-Military-Blue-2024/Lv2/img01.jpg?fm=webp&auto=compress&w=559&q=90&dpr=2&updated_at=1713385181","..."]},"brand":"Jordan","variants":["...trucated..."],"contentGroup":"sneakers","traits":["...truncated..."],"model":"Jordan 4 Retro","styleId":"FV5029-141","market":{"state":{"lowestAsk":{"amount":259},"numberOfAsks":5990,"highestBid":{"amount":291},"numberOfBids":1918,"numberOfCustodialAsks":0,"lowestCustodialAsk":null},"salesInformation":{"lastSale":248}}}
import json
from parsel import Selector
# install using `pip install zenrows`
from zenrows import ZenRowsClient
# create an API client instance
client = ZenRowsClient(apikey="YOUR API KEY")
# create scrape function that returns HTML parser for a given URL
def scrape(url: str, country: str="", render_js=False, headers: dict=None) -> Selector:
api_result = client.get(
url,
headers=headers,
params={
"json_response": "True",
"premium_proxy": "True",
"js_render": "True",
}
)
assert api_result.ok, api_result.text
data = api_result.json()
return Selector(data['html'])
url = "https://stockx.com/air-jordan-4-retro-military-blue-2024"
selector = scrape(url)
# The entire dataset can be found in a javascript variable:
data = selector.css("script#__NEXT_DATA__::text").get()
data = json.loads(data)
# full dataset is huge but can be reduced using jsonpath:
from jsonpath_ng import parse
products = []
for product in parse("$..product").find(data):
products.append(product.value)
print(len(products))
# the resulting dataset is pretty big but here are some example fields:
from pprint import pprint
pprint(products[0])
{
"listingType": "STANDARD",
"gender": "men",
"browseVerticals": ["sneakers"],
"primaryTitle": "Jordan 4 Retro",
"secondaryTitle": "Military Blue (2024)",
"description": "The Air Jordan 4 Retro Military Blue 2024 stands as a beacon of Jordan Brand's innovation and style. It features an off-white leather base contrasted with the striking military blue splashed on the eyelet wings, heel, and parts of the midsole, creating a look of disciplined yet daring design. The neutral grey touches on the forefoot and outsole balance the aesthetic, highlighting the sneaker's clean lines and geometric shapes.
Every detail is meticulously crafted, with the Jumpman logo on the tongue, the 'Flight' script on the tongue's underside, and a visible Air-Sole unit encased in the sole—all of which are hallmarks of the Jordan brand's dedication to quality and performance. The industrial blue mesh inserts not only offer breathability but also complement the sneaker's color scheme, adding both function and flair. The beloved Nike Air logo graces the heel and stays true to the original 1989 iteration.
Released on May 4, 2024, at a retail price of $215, the Air Jordan 4 Retro Military Blue quickly ascended to iconic status. Collectors and sneaker enthusiasts eagerly celebrated the revival of the military blue colorway on a timeless model.",
"condition": "New",
"productCategory": "sneakers",
"editionType": null,
"title": "Jordan 4 Retro Military Blue (2024)",
"media": {
"imageUrl": "https://images.stockx.com/images/Air-Jordan-4-Retro-Military-Blue-2024-Product.jpg?fit=fill&bg=FFFFFF&w=700&h=500&fm=webp&auto=compress&q=90&dpr=2&trim=color&updated_at=1713464187",
"all360Images": [
"https://images.stockx.com/360/Air-Jordan-4-Retro-Military-Blue-2024/Images/Air-Jordan-4-Retro-Military-Blue-2024/Lv2/img01.jpg?fm=webp&auto=compress&w=559&q=90&dpr=2&updated_at=1713385181",
"..."
]
},
"brand": "Jordan",
"variants": [ "...trucated..." ],
"contentGroup": "sneakers",
"traits": [ "...truncated..."],
"model": "Jordan 4 Retro",
"styleId": "FV5029-141",
"market": {
"state": {
"lowestAsk": {
"amount": 259
},
"numberOfAsks": 5990,
"highestBid": {
"amount": 291
},
"numberOfBids": 1918,
"numberOfCustodialAsks": 0,
"lowestCustodialAsk": null
},
"salesInformation": {
"lastSale": 248
}
}
}
importjsonfromparselimportSelector# scrapingdog has no integration but we can use httpx# install using `pip install httpx`importhttpx# create an API client instanceclient=httpx.Client(timeout=180)# create scrape function that returns HTML parser for a given URLdefscrape(url:str,country:str="",render_js=False,headers:dict=None)->Selector:payload={"api_key":"YOUR API KEY","url":url,"premium":"true",}api_result=client.post("https://api.scrapingdog.com/scrape",json=payload,)data=api_result.json()assertdata['success'],f"scrape failed: {data['message']}"returnSelector(data['html'])url="https://stockx.com/air-jordan-4-retro-military-blue-2024"selector=scrape(url)# The entire dataset can be found in a javascript variable:data=selector.css("script#__NEXT_DATA__::text").get()data=json.loads(data)# full dataset is huge but can be reduced using jsonpath:fromjsonpath_ngimportparseproducts=[]forproductinparse("$..product").find(data):products.append(product.value)print(len(products))# the resulting dataset is pretty big but here are some example fields:frompprintimportpprintpprint(products[0]){"listingType":"STANDARD","gender":"men","browseVerticals":["sneakers"],"primaryTitle":"Jordan 4 Retro","secondaryTitle":"Military Blue (2024)","description":"The Air Jordan 4 Retro Military Blue 2024 stands as a beacon of Jordan Brand's innovation and style. It features an off-white leather base contrasted with the striking military blue splashed on the eyelet wings, heel, and parts of the midsole, creating a look of disciplined yet daring design. The neutral grey touches on the forefoot and outsole balance the aesthetic, highlighting the sneaker's clean lines and geometric shapes.<br><br>Every detail is meticulously crafted, with the Jumpman logo on the tongue, the 'Flight' script on the tongue's underside, and a visible Air-Sole unit encased in the sole—all of which are hallmarks of the Jordan brand's dedication to quality and performance. The industrial blue mesh inserts not only offer breathability but also complement the sneaker's color scheme, adding both function and flair. The beloved Nike Air logo graces the heel and stays true to the original 1989 iteration.<br><br>Released on May 4, 2024, at a retail price of $215, the Air Jordan 4 Retro Military Blue quickly ascended to iconic status. Collectors and sneaker enthusiasts eagerly celebrated the revival of the military blue colorway on a timeless model.","condition":"New","productCategory":"sneakers","editionType":null,"title":"Jordan 4 Retro Military Blue (2024)","media":{"imageUrl":"https://images.stockx.com/images/Air-Jordan-4-Retro-Military-Blue-2024-Product.jpg?fit=fill&bg=FFFFFF&w=700&h=500&fm=webp&auto=compress&q=90&dpr=2&trim=color&updated_at=1713464187","all360Images":["https://images.stockx.com/360/Air-Jordan-4-Retro-Military-Blue-2024/Images/Air-Jordan-4-Retro-Military-Blue-2024/Lv2/img01.jpg?fm=webp&auto=compress&w=559&q=90&dpr=2&updated_at=1713385181","..."]},"brand":"Jordan","variants":["...trucated..."],"contentGroup":"sneakers","traits":["...truncated..."],"model":"Jordan 4 Retro","styleId":"FV5029-141","market":{"state":{"lowestAsk":{"amount":259},"numberOfAsks":5990,"highestBid":{"amount":291},"numberOfBids":1918,"numberOfCustodialAsks":0,"lowestCustodialAsk":null},"salesInformation":{"lastSale":248}}}
import json
from parsel import Selector
# scrapingdog has no integration but we can use httpx
# install using `pip install httpx`
import httpx
# create an API client instance
client = httpx.Client(timeout=180)
# create scrape function that returns HTML parser for a given URL
def scrape(url: str, country: str="", render_js=False, headers: dict=None) -> Selector:
payload = {
"api_key": "YOUR API KEY",
"url": url,
"premium": "true",
}
api_result = client.post(
"https://api.scrapingdog.com/scrape",
json=payload,
)
data = api_result.json()
assert data['success'], f"scrape failed: {data['message']}"
return Selector(data['html'])
url = "https://stockx.com/air-jordan-4-retro-military-blue-2024"
selector = scrape(url)
# The entire dataset can be found in a javascript variable:
data = selector.css("script#__NEXT_DATA__::text").get()
data = json.loads(data)
# full dataset is huge but can be reduced using jsonpath:
from jsonpath_ng import parse
products = []
for product in parse("$..product").find(data):
products.append(product.value)
print(len(products))
# the resulting dataset is pretty big but here are some example fields:
from pprint import pprint
pprint(products[0])
{
"listingType": "STANDARD",
"gender": "men",
"browseVerticals": ["sneakers"],
"primaryTitle": "Jordan 4 Retro",
"secondaryTitle": "Military Blue (2024)",
"description": "The Air Jordan 4 Retro Military Blue 2024 stands as a beacon of Jordan Brand's innovation and style. It features an off-white leather base contrasted with the striking military blue splashed on the eyelet wings, heel, and parts of the midsole, creating a look of disciplined yet daring design. The neutral grey touches on the forefoot and outsole balance the aesthetic, highlighting the sneaker's clean lines and geometric shapes.
Every detail is meticulously crafted, with the Jumpman logo on the tongue, the 'Flight' script on the tongue's underside, and a visible Air-Sole unit encased in the sole—all of which are hallmarks of the Jordan brand's dedication to quality and performance. The industrial blue mesh inserts not only offer breathability but also complement the sneaker's color scheme, adding both function and flair. The beloved Nike Air logo graces the heel and stays true to the original 1989 iteration.
Released on May 4, 2024, at a retail price of $215, the Air Jordan 4 Retro Military Blue quickly ascended to iconic status. Collectors and sneaker enthusiasts eagerly celebrated the revival of the military blue colorway on a timeless model.",
"condition": "New",
"productCategory": "sneakers",
"editionType": null,
"title": "Jordan 4 Retro Military Blue (2024)",
"media": {
"imageUrl": "https://images.stockx.com/images/Air-Jordan-4-Retro-Military-Blue-2024-Product.jpg?fit=fill&bg=FFFFFF&w=700&h=500&fm=webp&auto=compress&q=90&dpr=2&trim=color&updated_at=1713464187",
"all360Images": [
"https://images.stockx.com/360/Air-Jordan-4-Retro-Military-Blue-2024/Images/Air-Jordan-4-Retro-Military-Blue-2024/Lv2/img01.jpg?fm=webp&auto=compress&w=559&q=90&dpr=2&updated_at=1713385181",
"..."
]
},
"brand": "Jordan",
"variants": [ "...trucated..." ],
"contentGroup": "sneakers",
"traits": [ "...truncated..."],
"model": "Jordan 4 Retro",
"styleId": "FV5029-141",
"market": {
"state": {
"lowestAsk": {
"amount": 259
},
"numberOfAsks": 5990,
"highestBid": {
"amount": 291
},
"numberOfBids": 1918,
"numberOfCustodialAsks": 0,
"lowestCustodialAsk": null
},
"salesInformation": {
"lastSale": 248
}
}
}
importjsonfromparselimportSelector# install using `pip install scraperapi`fromscraper_apiimportScraperAPIClient# create an API client instanceclient=ScraperAPIClient(api_key="YOUR API KEY")# create scrape function that returns HTML parser for a given URLdefscrape(url:str,country:str="",render_js=False,headers:dict=None)->Selector:api_result=client.get(url=url,headers=headersor{},premium=True,)assertapi_result.ok,api_result.textreturnSelector(api_result.text)url="https://stockx.com/air-jordan-4-retro-military-blue-2024"selector=scrape(url)# The entire dataset can be found in a javascript variable:data=selector.css("script#__NEXT_DATA__::text").get()data=json.loads(data)# full dataset is huge but can be reduced using jsonpath:fromjsonpath_ngimportparseproducts=[]forproductinparse("$..product").find(data):products.append(product.value)print(len(products))# the resulting dataset is pretty big but here are some example fields:frompprintimportpprintpprint(products[0]){"listingType":"STANDARD","gender":"men","browseVerticals":["sneakers"],"primaryTitle":"Jordan 4 Retro","secondaryTitle":"Military Blue (2024)","description":"The Air Jordan 4 Retro Military Blue 2024 stands as a beacon of Jordan Brand's innovation and style. It features an off-white leather base contrasted with the striking military blue splashed on the eyelet wings, heel, and parts of the midsole, creating a look of disciplined yet daring design. The neutral grey touches on the forefoot and outsole balance the aesthetic, highlighting the sneaker's clean lines and geometric shapes.<br><br>Every detail is meticulously crafted, with the Jumpman logo on the tongue, the 'Flight' script on the tongue's underside, and a visible Air-Sole unit encased in the sole—all of which are hallmarks of the Jordan brand's dedication to quality and performance. The industrial blue mesh inserts not only offer breathability but also complement the sneaker's color scheme, adding both function and flair. The beloved Nike Air logo graces the heel and stays true to the original 1989 iteration.<br><br>Released on May 4, 2024, at a retail price of $215, the Air Jordan 4 Retro Military Blue quickly ascended to iconic status. Collectors and sneaker enthusiasts eagerly celebrated the revival of the military blue colorway on a timeless model.","condition":"New","productCategory":"sneakers","editionType":null,"title":"Jordan 4 Retro Military Blue (2024)","media":{"imageUrl":"https://images.stockx.com/images/Air-Jordan-4-Retro-Military-Blue-2024-Product.jpg?fit=fill&bg=FFFFFF&w=700&h=500&fm=webp&auto=compress&q=90&dpr=2&trim=color&updated_at=1713464187","all360Images":["https://images.stockx.com/360/Air-Jordan-4-Retro-Military-Blue-2024/Images/Air-Jordan-4-Retro-Military-Blue-2024/Lv2/img01.jpg?fm=webp&auto=compress&w=559&q=90&dpr=2&updated_at=1713385181","..."]},"brand":"Jordan","variants":["...trucated..."],"contentGroup":"sneakers","traits":["...truncated..."],"model":"Jordan 4 Retro","styleId":"FV5029-141","market":{"state":{"lowestAsk":{"amount":259},"numberOfAsks":5990,"highestBid":{"amount":291},"numberOfBids":1918,"numberOfCustodialAsks":0,"lowestCustodialAsk":null},"salesInformation":{"lastSale":248}}}
import json
from parsel import Selector
# install using `pip install scraperapi`
from scraper_api import ScraperAPIClient
# create an API client instance
client = ScraperAPIClient(api_key="YOUR API KEY")
# create scrape function that returns HTML parser for a given URL
def scrape(url: str, country: str="", render_js=False, headers: dict=None) -> Selector:
api_result = client.get(
url=url,
headers=headers or {},
premium=True,
)
assert api_result.ok, api_result.text
return Selector(api_result.text)
url = "https://stockx.com/air-jordan-4-retro-military-blue-2024"
selector = scrape(url)
# The entire dataset can be found in a javascript variable:
data = selector.css("script#__NEXT_DATA__::text").get()
data = json.loads(data)
# full dataset is huge but can be reduced using jsonpath:
from jsonpath_ng import parse
products = []
for product in parse("$..product").find(data):
products.append(product.value)
print(len(products))
# the resulting dataset is pretty big but here are some example fields:
from pprint import pprint
pprint(products[0])
{
"listingType": "STANDARD",
"gender": "men",
"browseVerticals": ["sneakers"],
"primaryTitle": "Jordan 4 Retro",
"secondaryTitle": "Military Blue (2024)",
"description": "The Air Jordan 4 Retro Military Blue 2024 stands as a beacon of Jordan Brand's innovation and style. It features an off-white leather base contrasted with the striking military blue splashed on the eyelet wings, heel, and parts of the midsole, creating a look of disciplined yet daring design. The neutral grey touches on the forefoot and outsole balance the aesthetic, highlighting the sneaker's clean lines and geometric shapes.
Every detail is meticulously crafted, with the Jumpman logo on the tongue, the 'Flight' script on the tongue's underside, and a visible Air-Sole unit encased in the sole—all of which are hallmarks of the Jordan brand's dedication to quality and performance. The industrial blue mesh inserts not only offer breathability but also complement the sneaker's color scheme, adding both function and flair. The beloved Nike Air logo graces the heel and stays true to the original 1989 iteration.
Released on May 4, 2024, at a retail price of $215, the Air Jordan 4 Retro Military Blue quickly ascended to iconic status. Collectors and sneaker enthusiasts eagerly celebrated the revival of the military blue colorway on a timeless model.",
"condition": "New",
"productCategory": "sneakers",
"editionType": null,
"title": "Jordan 4 Retro Military Blue (2024)",
"media": {
"imageUrl": "https://images.stockx.com/images/Air-Jordan-4-Retro-Military-Blue-2024-Product.jpg?fit=fill&bg=FFFFFF&w=700&h=500&fm=webp&auto=compress&q=90&dpr=2&trim=color&updated_at=1713464187",
"all360Images": [
"https://images.stockx.com/360/Air-Jordan-4-Retro-Military-Blue-2024/Images/Air-Jordan-4-Retro-Military-Blue-2024/Lv2/img01.jpg?fm=webp&auto=compress&w=559&q=90&dpr=2&updated_at=1713385181",
"..."
]
},
"brand": "Jordan",
"variants": [ "...trucated..." ],
"contentGroup": "sneakers",
"traits": [ "...truncated..."],
"model": "Jordan 4 Retro",
"styleId": "FV5029-141",
"market": {
"state": {
"lowestAsk": {
"amount": 259
},
"numberOfAsks": 5990,
"highestBid": {
"amount": 291
},
"numberOfBids": 1918,
"numberOfCustodialAsks": 0,
"lowestCustodialAsk": null
},
"salesInformation": {
"lastSale": 248
}
}
}
importjsonfromparselimportSelector# install using `pip install scrapfly-sdk`fromscrapflyimportScrapflyClient,ScrapeConfig,ScrapeApiResponse# create an API client instanceclient=ScrapflyClient(key="YOUR API KEY")# create scrape function that returns HTML parser for a given URLdefscrape(url:str,country:str="",render_js=False,headers:dict=None)->Selector:api_result=client.scrape(ScrapeConfig(url=url,asp=True,country='US',))returnapi_result.selectorurl="https://stockx.com/air-jordan-4-retro-military-blue-2024"selector=scrape(url)# The entire dataset can be found in a javascript variable:data=selector.css("script#__NEXT_DATA__::text").get()data=json.loads(data)# full dataset is huge but can be reduced using jsonpath:fromjsonpath_ngimportparseproducts=[]forproductinparse("$..product").find(data):products.append(product.value)print(len(products))# the resulting dataset is pretty big but here are some example fields:frompprintimportpprintpprint(products[0]){"listingType":"STANDARD","gender":"men","browseVerticals":["sneakers"],"primaryTitle":"Jordan 4 Retro","secondaryTitle":"Military Blue (2024)","description":"The Air Jordan 4 Retro Military Blue 2024 stands as a beacon of Jordan Brand's innovation and style. It features an off-white leather base contrasted with the striking military blue splashed on the eyelet wings, heel, and parts of the midsole, creating a look of disciplined yet daring design. The neutral grey touches on the forefoot and outsole balance the aesthetic, highlighting the sneaker's clean lines and geometric shapes.<br><br>Every detail is meticulously crafted, with the Jumpman logo on the tongue, the 'Flight' script on the tongue's underside, and a visible Air-Sole unit encased in the sole—all of which are hallmarks of the Jordan brand's dedication to quality and performance. The industrial blue mesh inserts not only offer breathability but also complement the sneaker's color scheme, adding both function and flair. The beloved Nike Air logo graces the heel and stays true to the original 1989 iteration.<br><br>Released on May 4, 2024, at a retail price of $215, the Air Jordan 4 Retro Military Blue quickly ascended to iconic status. Collectors and sneaker enthusiasts eagerly celebrated the revival of the military blue colorway on a timeless model.","condition":"New","productCategory":"sneakers","editionType":null,"title":"Jordan 4 Retro Military Blue (2024)","media":{"imageUrl":"https://images.stockx.com/images/Air-Jordan-4-Retro-Military-Blue-2024-Product.jpg?fit=fill&bg=FFFFFF&w=700&h=500&fm=webp&auto=compress&q=90&dpr=2&trim=color&updated_at=1713464187","all360Images":["https://images.stockx.com/360/Air-Jordan-4-Retro-Military-Blue-2024/Images/Air-Jordan-4-Retro-Military-Blue-2024/Lv2/img01.jpg?fm=webp&auto=compress&w=559&q=90&dpr=2&updated_at=1713385181","..."]},"brand":"Jordan","variants":["...trucated..."],"contentGroup":"sneakers","traits":["...truncated..."],"model":"Jordan 4 Retro","styleId":"FV5029-141","market":{"state":{"lowestAsk":{"amount":259},"numberOfAsks":5990,"highestBid":{"amount":291},"numberOfBids":1918,"numberOfCustodialAsks":0,"lowestCustodialAsk":null},"salesInformation":{"lastSale":248}}}
import json
from parsel import Selector
# install using `pip install scrapfly-sdk`
from scrapfly import ScrapflyClient, ScrapeConfig, ScrapeApiResponse
# create an API client instance
client = ScrapflyClient(key="YOUR API KEY")
# create scrape function that returns HTML parser for a given URL
def scrape(url: str, country: str="", render_js=False, headers: dict=None) -> Selector:
api_result = client.scrape(ScrapeConfig(
url=url,
asp=True,
country='US',
))
return api_result.selector
url = "https://stockx.com/air-jordan-4-retro-military-blue-2024"
selector = scrape(url)
# The entire dataset can be found in a javascript variable:
data = selector.css("script#__NEXT_DATA__::text").get()
data = json.loads(data)
# full dataset is huge but can be reduced using jsonpath:
from jsonpath_ng import parse
products = []
for product in parse("$..product").find(data):
products.append(product.value)
print(len(products))
# the resulting dataset is pretty big but here are some example fields:
from pprint import pprint
pprint(products[0])
{
"listingType": "STANDARD",
"gender": "men",
"browseVerticals": ["sneakers"],
"primaryTitle": "Jordan 4 Retro",
"secondaryTitle": "Military Blue (2024)",
"description": "The Air Jordan 4 Retro Military Blue 2024 stands as a beacon of Jordan Brand's innovation and style. It features an off-white leather base contrasted with the striking military blue splashed on the eyelet wings, heel, and parts of the midsole, creating a look of disciplined yet daring design. The neutral grey touches on the forefoot and outsole balance the aesthetic, highlighting the sneaker's clean lines and geometric shapes.
Every detail is meticulously crafted, with the Jumpman logo on the tongue, the 'Flight' script on the tongue's underside, and a visible Air-Sole unit encased in the sole—all of which are hallmarks of the Jordan brand's dedication to quality and performance. The industrial blue mesh inserts not only offer breathability but also complement the sneaker's color scheme, adding both function and flair. The beloved Nike Air logo graces the heel and stays true to the original 1989 iteration.
Released on May 4, 2024, at a retail price of $215, the Air Jordan 4 Retro Military Blue quickly ascended to iconic status. Collectors and sneaker enthusiasts eagerly celebrated the revival of the military blue colorway on a timeless model.",
"condition": "New",
"productCategory": "sneakers",
"editionType": null,
"title": "Jordan 4 Retro Military Blue (2024)",
"media": {
"imageUrl": "https://images.stockx.com/images/Air-Jordan-4-Retro-Military-Blue-2024-Product.jpg?fit=fill&bg=FFFFFF&w=700&h=500&fm=webp&auto=compress&q=90&dpr=2&trim=color&updated_at=1713464187",
"all360Images": [
"https://images.stockx.com/360/Air-Jordan-4-Retro-Military-Blue-2024/Images/Air-Jordan-4-Retro-Military-Blue-2024/Lv2/img01.jpg?fm=webp&auto=compress&w=559&q=90&dpr=2&updated_at=1713385181",
"..."
]
},
"brand": "Jordan",
"variants": [ "...trucated..." ],
"contentGroup": "sneakers",
"traits": [ "...truncated..."],
"model": "Jordan 4 Retro",
"styleId": "FV5029-141",
"market": {
"state": {
"lowestAsk": {
"amount": 259
},
"numberOfAsks": 5990,
"highestBid": {
"amount": 291
},
"numberOfBids": 1918,
"numberOfCustodialAsks": 0,
"lowestCustodialAsk": null
},
"salesInformation": {
"lastSale": 248
}
}
}
importjsonfromparselimportSelector# install using `pip install scrapingant-client`fromscrapingant_clientimportScrapingAntClient# create an API client instanceclient=ScrapingAntClient(token="YOUR API KEY")# create scrape function that returns HTML parser for a given URLdefscrape(url:str,country:str="",render_js=False,headers:dict=None)->Selector:api_result=client.general_request(url,browser=True,return_page_source=False,proxy_type='datacenter',)assertapi_result.ok,api_result.textreturnSelector(api_result.text)url="https://stockx.com/air-jordan-4-retro-military-blue-2024"selector=scrape(url)# The entire dataset can be found in a javascript variable:data=selector.css("script#__NEXT_DATA__::text").get()data=json.loads(data)# full dataset is huge but can be reduced using jsonpath:fromjsonpath_ngimportparseproducts=[]forproductinparse("$..product").find(data):products.append(product.value)print(len(products))# the resulting dataset is pretty big but here are some example fields:frompprintimportpprintpprint(products[0]){"listingType":"STANDARD","gender":"men","browseVerticals":["sneakers"],"primaryTitle":"Jordan 4 Retro","secondaryTitle":"Military Blue (2024)","description":"The Air Jordan 4 Retro Military Blue 2024 stands as a beacon of Jordan Brand's innovation and style. It features an off-white leather base contrasted with the striking military blue splashed on the eyelet wings, heel, and parts of the midsole, creating a look of disciplined yet daring design. The neutral grey touches on the forefoot and outsole balance the aesthetic, highlighting the sneaker's clean lines and geometric shapes.<br><br>Every detail is meticulously crafted, with the Jumpman logo on the tongue, the 'Flight' script on the tongue's underside, and a visible Air-Sole unit encased in the sole—all of which are hallmarks of the Jordan brand's dedication to quality and performance. The industrial blue mesh inserts not only offer breathability but also complement the sneaker's color scheme, adding both function and flair. The beloved Nike Air logo graces the heel and stays true to the original 1989 iteration.<br><br>Released on May 4, 2024, at a retail price of $215, the Air Jordan 4 Retro Military Blue quickly ascended to iconic status. Collectors and sneaker enthusiasts eagerly celebrated the revival of the military blue colorway on a timeless model.","condition":"New","productCategory":"sneakers","editionType":null,"title":"Jordan 4 Retro Military Blue (2024)","media":{"imageUrl":"https://images.stockx.com/images/Air-Jordan-4-Retro-Military-Blue-2024-Product.jpg?fit=fill&bg=FFFFFF&w=700&h=500&fm=webp&auto=compress&q=90&dpr=2&trim=color&updated_at=1713464187","all360Images":["https://images.stockx.com/360/Air-Jordan-4-Retro-Military-Blue-2024/Images/Air-Jordan-4-Retro-Military-Blue-2024/Lv2/img01.jpg?fm=webp&auto=compress&w=559&q=90&dpr=2&updated_at=1713385181","..."]},"brand":"Jordan","variants":["...trucated..."],"contentGroup":"sneakers","traits":["...truncated..."],"model":"Jordan 4 Retro","styleId":"FV5029-141","market":{"state":{"lowestAsk":{"amount":259},"numberOfAsks":5990,"highestBid":{"amount":291},"numberOfBids":1918,"numberOfCustodialAsks":0,"lowestCustodialAsk":null},"salesInformation":{"lastSale":248}}}
import json
from parsel import Selector
# install using `pip install scrapingant-client`
from scrapingant_client import ScrapingAntClient
# create an API client instance
client = ScrapingAntClient(token="YOUR API KEY")
# create scrape function that returns HTML parser for a given URL
def scrape(url: str, country: str="", render_js=False, headers: dict=None) -> Selector:
api_result = client.general_request(
url,
browser=True,
return_page_source=False,
proxy_type='datacenter',
)
assert api_result.ok, api_result.text
return Selector(api_result.text)
url = "https://stockx.com/air-jordan-4-retro-military-blue-2024"
selector = scrape(url)
# The entire dataset can be found in a javascript variable:
data = selector.css("script#__NEXT_DATA__::text").get()
data = json.loads(data)
# full dataset is huge but can be reduced using jsonpath:
from jsonpath_ng import parse
products = []
for product in parse("$..product").find(data):
products.append(product.value)
print(len(products))
# the resulting dataset is pretty big but here are some example fields:
from pprint import pprint
pprint(products[0])
{
"listingType": "STANDARD",
"gender": "men",
"browseVerticals": ["sneakers"],
"primaryTitle": "Jordan 4 Retro",
"secondaryTitle": "Military Blue (2024)",
"description": "The Air Jordan 4 Retro Military Blue 2024 stands as a beacon of Jordan Brand's innovation and style. It features an off-white leather base contrasted with the striking military blue splashed on the eyelet wings, heel, and parts of the midsole, creating a look of disciplined yet daring design. The neutral grey touches on the forefoot and outsole balance the aesthetic, highlighting the sneaker's clean lines and geometric shapes.
Every detail is meticulously crafted, with the Jumpman logo on the tongue, the 'Flight' script on the tongue's underside, and a visible Air-Sole unit encased in the sole—all of which are hallmarks of the Jordan brand's dedication to quality and performance. The industrial blue mesh inserts not only offer breathability but also complement the sneaker's color scheme, adding both function and flair. The beloved Nike Air logo graces the heel and stays true to the original 1989 iteration.
Released on May 4, 2024, at a retail price of $215, the Air Jordan 4 Retro Military Blue quickly ascended to iconic status. Collectors and sneaker enthusiasts eagerly celebrated the revival of the military blue colorway on a timeless model.",
"condition": "New",
"productCategory": "sneakers",
"editionType": null,
"title": "Jordan 4 Retro Military Blue (2024)",
"media": {
"imageUrl": "https://images.stockx.com/images/Air-Jordan-4-Retro-Military-Blue-2024-Product.jpg?fit=fill&bg=FFFFFF&w=700&h=500&fm=webp&auto=compress&q=90&dpr=2&trim=color&updated_at=1713464187",
"all360Images": [
"https://images.stockx.com/360/Air-Jordan-4-Retro-Military-Blue-2024/Images/Air-Jordan-4-Retro-Military-Blue-2024/Lv2/img01.jpg?fm=webp&auto=compress&w=559&q=90&dpr=2&updated_at=1713385181",
"..."
]
},
"brand": "Jordan",
"variants": [ "...trucated..." ],
"contentGroup": "sneakers",
"traits": [ "...truncated..."],
"model": "Jordan 4 Retro",
"styleId": "FV5029-141",
"market": {
"state": {
"lowestAsk": {
"amount": 259
},
"numberOfAsks": 5990,
"highestBid": {
"amount": 291
},
"numberOfBids": 1918,
"numberOfCustodialAsks": 0,
"lowestCustodialAsk": null
},
"salesInformation": {
"lastSale": 248
}
}
}
importjsonfromparselimportSelector# webscrapingapi has a Python SDK but it's not great, use httpx instead:# `pip install httpx`importhttpx# create an API client instanceclient=httpx.Client(timeout=180)# create scrape function that returns HTML parser for a given URLdefscrape(url:str,country:str="",render_js=False,headers:dict=None)->Selector:api_result=client.get(url,headers=headers,params={"url":url,"api_key":"YOUR API KEY",# NOTE: add your API KEY here!"timeout":60_000,"render_js":"1",},)assertapi_result.status_code==200,api_result.reason_phrasereturnSelector(api_result.text)url="https://stockx.com/air-jordan-4-retro-military-blue-2024"selector=scrape(url)# The entire dataset can be found in a javascript variable:data=selector.css("script#__NEXT_DATA__::text").get()data=json.loads(data)# full dataset is huge but can be reduced using jsonpath:fromjsonpath_ngimportparseproducts=[]forproductinparse("$..product").find(data):products.append(product.value)print(len(products))# the resulting dataset is pretty big but here are some example fields:frompprintimportpprintpprint(products[0]){"listingType":"STANDARD","gender":"men","browseVerticals":["sneakers"],"primaryTitle":"Jordan 4 Retro","secondaryTitle":"Military Blue (2024)","description":"The Air Jordan 4 Retro Military Blue 2024 stands as a beacon of Jordan Brand's innovation and style. It features an off-white leather base contrasted with the striking military blue splashed on the eyelet wings, heel, and parts of the midsole, creating a look of disciplined yet daring design. The neutral grey touches on the forefoot and outsole balance the aesthetic, highlighting the sneaker's clean lines and geometric shapes.<br><br>Every detail is meticulously crafted, with the Jumpman logo on the tongue, the 'Flight' script on the tongue's underside, and a visible Air-Sole unit encased in the sole—all of which are hallmarks of the Jordan brand's dedication to quality and performance. The industrial blue mesh inserts not only offer breathability but also complement the sneaker's color scheme, adding both function and flair. The beloved Nike Air logo graces the heel and stays true to the original 1989 iteration.<br><br>Released on May 4, 2024, at a retail price of $215, the Air Jordan 4 Retro Military Blue quickly ascended to iconic status. Collectors and sneaker enthusiasts eagerly celebrated the revival of the military blue colorway on a timeless model.","condition":"New","productCategory":"sneakers","editionType":null,"title":"Jordan 4 Retro Military Blue (2024)","media":{"imageUrl":"https://images.stockx.com/images/Air-Jordan-4-Retro-Military-Blue-2024-Product.jpg?fit=fill&bg=FFFFFF&w=700&h=500&fm=webp&auto=compress&q=90&dpr=2&trim=color&updated_at=1713464187","all360Images":["https://images.stockx.com/360/Air-Jordan-4-Retro-Military-Blue-2024/Images/Air-Jordan-4-Retro-Military-Blue-2024/Lv2/img01.jpg?fm=webp&auto=compress&w=559&q=90&dpr=2&updated_at=1713385181","..."]},"brand":"Jordan","variants":["...trucated..."],"contentGroup":"sneakers","traits":["...truncated..."],"model":"Jordan 4 Retro","styleId":"FV5029-141","market":{"state":{"lowestAsk":{"amount":259},"numberOfAsks":5990,"highestBid":{"amount":291},"numberOfBids":1918,"numberOfCustodialAsks":0,"lowestCustodialAsk":null},"salesInformation":{"lastSale":248}}}
import json
from parsel import Selector
# webscrapingapi has a Python SDK but it's not great, use httpx instead:
# `pip install httpx`
import httpx
# create an API client instance
client = httpx.Client(timeout=180)
# create scrape function that returns HTML parser for a given URL
def scrape(url: str, country: str="", render_js=False, headers: dict=None) -> Selector:
api_result = client.get(
url,
headers=headers,
params={
"url": url,
"api_key": "YOUR API KEY", # NOTE: add your API KEY here!
"timeout": 60_000,
"render_js": "1",
},
)
assert api_result.status_code == 200, api_result.reason_phrase
return Selector(api_result.text)
url = "https://stockx.com/air-jordan-4-retro-military-blue-2024"
selector = scrape(url)
# The entire dataset can be found in a javascript variable:
data = selector.css("script#__NEXT_DATA__::text").get()
data = json.loads(data)
# full dataset is huge but can be reduced using jsonpath:
from jsonpath_ng import parse
products = []
for product in parse("$..product").find(data):
products.append(product.value)
print(len(products))
# the resulting dataset is pretty big but here are some example fields:
from pprint import pprint
pprint(products[0])
{
"listingType": "STANDARD",
"gender": "men",
"browseVerticals": ["sneakers"],
"primaryTitle": "Jordan 4 Retro",
"secondaryTitle": "Military Blue (2024)",
"description": "The Air Jordan 4 Retro Military Blue 2024 stands as a beacon of Jordan Brand's innovation and style. It features an off-white leather base contrasted with the striking military blue splashed on the eyelet wings, heel, and parts of the midsole, creating a look of disciplined yet daring design. The neutral grey touches on the forefoot and outsole balance the aesthetic, highlighting the sneaker's clean lines and geometric shapes.
Every detail is meticulously crafted, with the Jumpman logo on the tongue, the 'Flight' script on the tongue's underside, and a visible Air-Sole unit encased in the sole—all of which are hallmarks of the Jordan brand's dedication to quality and performance. The industrial blue mesh inserts not only offer breathability but also complement the sneaker's color scheme, adding both function and flair. The beloved Nike Air logo graces the heel and stays true to the original 1989 iteration.
Released on May 4, 2024, at a retail price of $215, the Air Jordan 4 Retro Military Blue quickly ascended to iconic status. Collectors and sneaker enthusiasts eagerly celebrated the revival of the military blue colorway on a timeless model.",
"condition": "New",
"productCategory": "sneakers",
"editionType": null,
"title": "Jordan 4 Retro Military Blue (2024)",
"media": {
"imageUrl": "https://images.stockx.com/images/Air-Jordan-4-Retro-Military-Blue-2024-Product.jpg?fit=fill&bg=FFFFFF&w=700&h=500&fm=webp&auto=compress&q=90&dpr=2&trim=color&updated_at=1713464187",
"all360Images": [
"https://images.stockx.com/360/Air-Jordan-4-Retro-Military-Blue-2024/Images/Air-Jordan-4-Retro-Military-Blue-2024/Lv2/img01.jpg?fm=webp&auto=compress&w=559&q=90&dpr=2&updated_at=1713385181",
"..."
]
},
"brand": "Jordan",
"variants": [ "...trucated..." ],
"contentGroup": "sneakers",
"traits": [ "...truncated..."],
"model": "Jordan 4 Retro",
"styleId": "FV5029-141",
"market": {
"state": {
"lowestAsk": {
"amount": 259
},
"numberOfAsks": 5990,
"highestBid": {
"amount": 291
},
"numberOfBids": 1918,
"numberOfCustodialAsks": 0,
"lowestCustodialAsk": null
},
"salesInformation": {
"lastSale": 248
}
}
}
importjsonfromparselimportSelector# install using `pip install scrapingbee`fromscrapingbeeimportScrapingBeeClient# create an API client instanceclient=ScrapingBeeClient(api_key="YOUR API KEY")# create scrape function that returns HTML parser for a given URLdefscrape(url:str,country:str="",render_js=False,headers:dict=None)->Selector:api_result=client.get(url,headers=headers,params={"json_response":True,"transparent_status_code":True,"premium_proxy":"True","render_js":"False",})assertapi_result.ok,api_result.textdata=api_result.json()returnSelector(data['body'])url="https://stockx.com/air-jordan-4-retro-military-blue-2024"selector=scrape(url)# The entire dataset can be found in a javascript variable:data=selector.css("script#__NEXT_DATA__::text").get()data=json.loads(data)# full dataset is huge but can be reduced using jsonpath:fromjsonpath_ngimportparseproducts=[]forproductinparse("$..product").find(data):products.append(product.value)print(len(products))# the resulting dataset is pretty big but here are some example fields:frompprintimportpprintpprint(products[0]){"listingType":"STANDARD","gender":"men","browseVerticals":["sneakers"],"primaryTitle":"Jordan 4 Retro","secondaryTitle":"Military Blue (2024)","description":"The Air Jordan 4 Retro Military Blue 2024 stands as a beacon of Jordan Brand's innovation and style. It features an off-white leather base contrasted with the striking military blue splashed on the eyelet wings, heel, and parts of the midsole, creating a look of disciplined yet daring design. The neutral grey touches on the forefoot and outsole balance the aesthetic, highlighting the sneaker's clean lines and geometric shapes.<br><br>Every detail is meticulously crafted, with the Jumpman logo on the tongue, the 'Flight' script on the tongue's underside, and a visible Air-Sole unit encased in the sole—all of which are hallmarks of the Jordan brand's dedication to quality and performance. The industrial blue mesh inserts not only offer breathability but also complement the sneaker's color scheme, adding both function and flair. The beloved Nike Air logo graces the heel and stays true to the original 1989 iteration.<br><br>Released on May 4, 2024, at a retail price of $215, the Air Jordan 4 Retro Military Blue quickly ascended to iconic status. Collectors and sneaker enthusiasts eagerly celebrated the revival of the military blue colorway on a timeless model.","condition":"New","productCategory":"sneakers","editionType":null,"title":"Jordan 4 Retro Military Blue (2024)","media":{"imageUrl":"https://images.stockx.com/images/Air-Jordan-4-Retro-Military-Blue-2024-Product.jpg?fit=fill&bg=FFFFFF&w=700&h=500&fm=webp&auto=compress&q=90&dpr=2&trim=color&updated_at=1713464187","all360Images":["https://images.stockx.com/360/Air-Jordan-4-Retro-Military-Blue-2024/Images/Air-Jordan-4-Retro-Military-Blue-2024/Lv2/img01.jpg?fm=webp&auto=compress&w=559&q=90&dpr=2&updated_at=1713385181","..."]},"brand":"Jordan","variants":["...trucated..."],"contentGroup":"sneakers","traits":["...truncated..."],"model":"Jordan 4 Retro","styleId":"FV5029-141","market":{"state":{"lowestAsk":{"amount":259},"numberOfAsks":5990,"highestBid":{"amount":291},"numberOfBids":1918,"numberOfCustodialAsks":0,"lowestCustodialAsk":null},"salesInformation":{"lastSale":248}}}
import json
from parsel import Selector
# install using `pip install scrapingbee`
from scrapingbee import ScrapingBeeClient
# create an API client instance
client = ScrapingBeeClient(api_key="YOUR API KEY")
# create scrape function that returns HTML parser for a given URL
def scrape(url: str, country: str="", render_js=False, headers: dict=None) -> Selector:
api_result = client.get(
url,
headers=headers,
params={
"json_response": True,
"transparent_status_code": True,
"premium_proxy": "True",
"render_js": "False",
}
)
assert api_result.ok, api_result.text
data = api_result.json()
return Selector(data['body'])
url = "https://stockx.com/air-jordan-4-retro-military-blue-2024"
selector = scrape(url)
# The entire dataset can be found in a javascript variable:
data = selector.css("script#__NEXT_DATA__::text").get()
data = json.loads(data)
# full dataset is huge but can be reduced using jsonpath:
from jsonpath_ng import parse
products = []
for product in parse("$..product").find(data):
products.append(product.value)
print(len(products))
# the resulting dataset is pretty big but here are some example fields:
from pprint import pprint
pprint(products[0])
{
"listingType": "STANDARD",
"gender": "men",
"browseVerticals": ["sneakers"],
"primaryTitle": "Jordan 4 Retro",
"secondaryTitle": "Military Blue (2024)",
"description": "The Air Jordan 4 Retro Military Blue 2024 stands as a beacon of Jordan Brand's innovation and style. It features an off-white leather base contrasted with the striking military blue splashed on the eyelet wings, heel, and parts of the midsole, creating a look of disciplined yet daring design. The neutral grey touches on the forefoot and outsole balance the aesthetic, highlighting the sneaker's clean lines and geometric shapes.
Every detail is meticulously crafted, with the Jumpman logo on the tongue, the 'Flight' script on the tongue's underside, and a visible Air-Sole unit encased in the sole—all of which are hallmarks of the Jordan brand's dedication to quality and performance. The industrial blue mesh inserts not only offer breathability but also complement the sneaker's color scheme, adding both function and flair. The beloved Nike Air logo graces the heel and stays true to the original 1989 iteration.
Released on May 4, 2024, at a retail price of $215, the Air Jordan 4 Retro Military Blue quickly ascended to iconic status. Collectors and sneaker enthusiasts eagerly celebrated the revival of the military blue colorway on a timeless model.",
"condition": "New",
"productCategory": "sneakers",
"editionType": null,
"title": "Jordan 4 Retro Military Blue (2024)",
"media": {
"imageUrl": "https://images.stockx.com/images/Air-Jordan-4-Retro-Military-Blue-2024-Product.jpg?fit=fill&bg=FFFFFF&w=700&h=500&fm=webp&auto=compress&q=90&dpr=2&trim=color&updated_at=1713464187",
"all360Images": [
"https://images.stockx.com/360/Air-Jordan-4-Retro-Military-Blue-2024/Images/Air-Jordan-4-Retro-Military-Blue-2024/Lv2/img01.jpg?fm=webp&auto=compress&w=559&q=90&dpr=2&updated_at=1713385181",
"..."
]
},
"brand": "Jordan",
"variants": [ "...trucated..." ],
"contentGroup": "sneakers",
"traits": [ "...truncated..."],
"model": "Jordan 4 Retro",
"styleId": "FV5029-141",
"market": {
"state": {
"lowestAsk": {
"amount": 259
},
"numberOfAsks": 5990,
"highestBid": {
"amount": 291
},
"numberOfBids": 1918,
"numberOfCustodialAsks": 0,
"lowestCustodialAsk": null
},
"salesInformation": {
"lastSale": 248
}
}
}
For scraping stockx.com above we're retrieving the HTML and extract the entire page dataset from a
hidden JSON variable. As Stockx is using next.js for page rendering the full product dataset can be found
in the "product" key. For that we're using jsonpath to select this key recursively.
Why scrape Stockx Products?
StockX is a popular web scraping target because it has a large amount of
e-commerce apparel data that can be used for various purposes like price monitoring,
market research, and competitive analysis.
With price and sale monitoring scraping we can keep track
of the product's historic pricing data and current price trends.
This is particularly useful because of the unique pricing structure of StockX
which treats products as stocks.
Market research scraping, and especially review and bid/ask scraping,
can help us understand customer preferences through sentiment analysis and price fluctuations.
This can be used to identify trends through statistics and make informed decisions a
bout product development and marketing strategies.
Stockx.com is also often scraped by Stockx sellers themselves to monitor competition
and adjust their product and pricing strategies.
Finally, Stockx contains a lot of user-generated data in form of reviews
which can be used in AI training.