Fanatics APIfanatics.com ↗
Retrieve product name, price, stock level, variant availability, and purchase action for any Fanatics.com product page via a single API endpoint.
What is the Fanatics API?
The Fanatics.com API exposes 1 endpoint — get_product — that returns 14 structured fields for any Fanatics product page, including current and regular price, per-size variant availability, stock quantity, and a derived purchase_action that tells you whether an item can be added to cart, pre-ordered, put on a notify-me list, or is unavailable. Pass either a full product URL or a numeric product ID to retrieve the data.
curl -X GET 'https://api.parse.bot/scraper/93ef3a96-f2fc-44c1-b620-00962251f74b/get_product?product=https%3A%2F%2Fwww.fanatics.com%2Fformula-1%2Fformula-1-merchandise%2F2026-topps-chrome-formula-1-factory-sealed-mega-box%2Fo-21875592%2Bt-98213354%2Bp-57227825783%2Bz-9-2569285396' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace fanatics-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: Fanatics product details — look up a product and inspect its availability."""
from parse_apis.fanatics_com_api import Fanatics, ProductNotFound
client = Fanatics()
# Fetch a product by its full URL.
try:
product = client.products.get(
product="https://www.fanatics.com/formula-1/formula-1-merchandise/2026-topps-chrome-formula-1-factory-sealed-mega-box/o-21875592+t-98213354+p-57227825783+z-9-2569285396"
)
except ProductNotFound:
print("Product not found")
raise SystemExit
print(product.name, "-", product.brand)
print(f" Price: {product.current_price} {product.currency} (regular {product.regular_price})")
print(f" Can add to cart: {product.can_add_to_cart}, action: {product.purchase_action}")
# Walk per-size availability using the typed Size objects.
for variant in product.sizes:
status = "in stock" if variant.available else "out of stock"
print(f" {variant.size}: {variant.price} {product.currency} — {status} (qty {variant.quantity_on_hand})")
# Re-fetch the same product by its numeric ID (discovered from the first call).
refreshed = client.products.get(product=product.product_id)
print(f"\nRefreshed: {refreshed.name}, active={refreshed.is_active}")
print("exercised: products.get (by URL and by ID)")
Returns the details of one Fanatics.com product: name, numeric product ID, current and regular price in the site's currency, stock level, per-size/variant availability, and a derived purchase_action (add_to_cart, pre_order, notify_me, or unavailable) that states whether the product can currently be bought. can_add_to_cart is true when at least one size/variant is available; is_pre_order is true when an available variant carries a promise ship date (pre-order products were not observed during the build, so that branch is unverified). One page request per call. An unknown product ID or URL returns a stale_input (not found) error.
| Param | Type | Description |
|---|---|---|
| productrequired | string | Either a full fanatics.com product page URL, or the numeric Fanatics product ID (the product_id value this endpoint returns, e.g. 205076860). |
{
"type": "object",
"fields": {
"url": "canonical product page URL",
"name": "product title",
"team": "array of team names",
"brand": "brand name",
"sizes": "array of size/variant records: item_id, size, available, quantity_on_hand, quantity_level, promise_ship_date, max_quantity_per_order, price",
"league": "array of league names",
"on_sale": "site's on-sale flag",
"currency": "ISO currency code of the prices",
"few_left": "few-left flag",
"image_url": "primary image URL",
"is_active": "product is active on the site",
"categories": "array of category names",
"product_id": "numeric Fanatics product ID as a string",
"is_pre_order": "true when an available variant has a promise ship date (pre-order)",
"product_tags": "array of site tags",
"stock_status": "site stock status text, null when none",
"current_price": "current selling price (number)",
"has_inventory": "site-level inventory flag",
"is_customized": "customizable product flag",
"is_returnable": "whether the item is eligible for returns",
"ready_to_ship": "ready-to-ship flag",
"regular_price": "regular/list price (number)",
"stock_message": "site stock message text, null when none",
"quantity_level": "site stock level label (e.g. no_inventory, low)",
"can_add_to_cart": "true when at least one variant is available to add to cart",
"purchase_action": "add_to_cart | pre_order | notify_me | unavailable",
"markdown_percent": "percent discount from regular to current price",
"notify_me_eligible": "whether a back-in-stock notification is offered"
},
"sample": {
"data": {
"url": "https://www.fanatics.com/formula-1/formula-1-merchandise/2026-topps-chrome-formula-1-factory-sealed-mega-box/o-21875592+t-98213354+p-57227825783+z-9-2569285396",
"name": "2026 Topps Chrome Formula 1 Factory Sealed Mega Box",
"team": [
"Formula 1 Merchandise"
],
"brand": "Topps",
"sizes": [
{
"size": "No Size",
"price": 69.99,
"item_id": "214182657",
"available": false,
"quantity_level": "no_inventory",
"quantity_on_hand": 0,
"promise_ship_date": null,
"max_quantity_per_order": 8
}
],
"league": [
"Formula 1"
],
"on_sale": false,
"currency": "USD",
"few_left": false,
"image_url": "https://fanatics.frgimages.com/formula-1-merchandise/2026-topps-chrome-formula-1%C2%A0factory-sealed-mega-box_ss5_p-205076860+u-a8dnwpg2bge3blhyo8gt+v-lfzynuz0z5azohhuubck.jpg?_hv=2",
"is_active": true,
"categories": [
"Collectibles & Memorabilia",
"Trading Cards",
"Trading Cards"
],
"product_id": "205076860",
"is_pre_order": false,
"product_tags": [
"Topps Consignment",
"New Arrivals"
],
"stock_status": null,
"current_price": 69.99,
"has_inventory": false,
"is_customized": false,
"is_returnable": false,
"ready_to_ship": false,
"regular_price": 69.99,
"stock_message": null,
"quantity_level": "no_inventory",
"can_add_to_cart": false,
"purchase_action": "unavailable",
"markdown_percent": 0,
"notify_me_eligible": false
},
"status": "success"
}
}About the Fanatics API
What get_product Returns
The get_product endpoint accepts a product parameter — either a full fanatics.com product page URL or the numeric Fanatics product ID. It returns a canonical url, the product name, brand, associated league and team arrays, an image_url, and the ISO currency code alongside the current and regular prices. The on_sale flag and few_left flag come back as booleans directly from the product record.
Variant and Stock Fields
The sizes array is the most granular part of the response. Each entry in the array represents a single size or variant and carries: item_id, size label, available boolean, quantity_on_hand, quantity_level (a tiered stock indicator), promise_ship_date, and max_quantity_per_order. This lets you distinguish between a product that is globally out of stock and one where only certain sizes remain, or where a specific variant ships later than others.
The purchase_action Field
Rather than leaving you to derive purchasability from raw stock fields, the endpoint returns a purchase_action string. The four possible values — add_to_cart, pre_order, notify_me, and unavailable — map directly to the actionable state of the product at the time of the request. This is useful for alerting workflows, price trackers, and inventory monitors that need a single reliable signal without re-implementing the purchasability logic themselves.
Coverage Scope
The API covers licensed sports merchandise listed on fanatics.com, including items associated with NFL, NBA, MLB, NHL, Formula 1, and other leagues represented on the platform. Each product may carry multiple team and league associations, which are returned as arrays. Products without league or team attribution (e.g. generic collectibles) return empty arrays for those fields.
The Fanatics API is a managed, monitored endpoint for fanatics.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when fanatics.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official fanatics.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Monitor price drops on specific Fanatics products by comparing
on_saleand current price fields over time. - Track restocks for sold-out jersey sizes by polling the
sizes[].availableandquantity_on_handfields. - Build a pre-order alert system using the
purchase_actionfield to detect when a product transitions frompre_ordertoadd_to_cart. - Aggregate licensed merchandise inventory across multiple team pages by iterating product IDs and recording
quantity_levelvalues. - Surface
few_leftwarnings in a fan shop dashboard to prompt urgency messaging before items go out of stock. - Compare regular vs. current price across a set of product IDs to identify active promotions without visiting each page.
- Filter collectible products by league or team using the
leagueandteamarrays to build sport-specific product feeds.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Fanatics have an official public developer API?+
What does the `purchase_action` field actually distinguish?+
add_to_cart means the product is in stock and purchasable now; pre_order means it can be reserved before its release date; notify_me means it is currently unavailable but the site offers a restock notification; unavailable means none of those actions are currently possible. The distinction between notify_me and unavailable is meaningful for alert-system logic.Can I look up a product by its numeric ID instead of its full URL?+
product input parameter accepts either a full fanatics.com product page URL or the numeric product ID alone (the product_id value the endpoint also returns in its response). Both formats resolve to the same product record.Does the API return customer reviews or ratings for Fanatics products?+
Is there a way to search Fanatics by team or league rather than fetching one product at a time?+
get_product endpoint; there is no search or browse endpoint that accepts a team name or league as a filter. You can fork the API on Parse and revise it to add a search or category-listing endpoint.