PWCC Marketplace APIpwccmarketplace.com ↗
Search and retrieve graded trading card listings from PWCC/Fanatics Collect. Get PSA grades, cert numbers, auction prices, card year, set, and more.
What is the PWCC Marketplace API?
The PWCC Marketplace API provides 2 endpoints for searching and retrieving graded trading card listings from the Fanatics Collect (PWCC) marketplace. The search_listings endpoint returns paginated results covering card title, PSA grade, certification number, sale price, year, brand, and card number — filterable by listing status (Sold or Live) and marketplace type (PREMIER, WEEKLY, or FIXED). A second endpoint, get_listing_details, returns full per-listing data by UUID.
curl -X GET 'https://api.parse.bot/scraper/6f75fc48-78a3-4fa4-a96a-937d35bf9385/search_listings' \ -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 pwccmarketplace-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.
"""
PWCC / Fanatics Collect Marketplace API Client
Get your API key from: https://parse.bot/settings
"""
import os
import requests
from typing import Optional
class ParseClient:
"""Client for PWCC / Fanatics Collect Marketplace API"""
def __init__(self, api_key: Optional[str] = None):
self.base_url = "https://api.parse.bot"
self.scraper_id = "6f75fc48-78a3-4fa4-a96a-937d35bf9385"
self.api_key = api_key or os.getenv("PARSE_API_KEY")
if not self.api_key:
raise ValueError("API key must be provided or set in PARSE_API_KEY environment variable")
def _call(self, endpoint: str, method: str = "POST", **params) -> dict:
"""Make API call to Parse Bot"""
headers = {
"X-API-Key": self.api_key,
"Content-Type": "application/json"
}
url = f"{self.base_url}/scraper/{self.scraper_id}/{endpoint}"
if method == "GET":
response = requests.get(url, headers=headers, params=params)
elif method == "POST":
response = requests.post(url, headers=headers, json=params)
else:
raise ValueError(f"Unsupported HTTP method: {method}")
response.raise_for_status()
return response.json()
def search_listings(
self,
keywords: str,
page: int = 0,
hits_per_page: int = 20,
marketplace: Optional[str] = None,
status: Optional[str] = None
) -> dict:
"""
Search PWCC/Fanatics Collect marketplace listings by keywords.
Args:
keywords: Search keywords (e.g. 'charizard psa 10', 'michael jordan rookie')
page: Zero-based page number for pagination (default: 0)
hits_per_page: Number of results per page (default: 20)
marketplace: Filter by marketplace type (PREMIER, WEEKLY, FIXED)
status: Filter by listing status (Sold, Live)
Returns:
Dictionary with results, total_hits, page info
"""
params = {
"keywords": keywords,
"page": page,
"hits_per_page": hits_per_page
}
if marketplace:
params["marketplace"] = marketplace
if status:
params["status"] = status
return self._call("search_listings", method="GET", **params)
def get_listing_details(self, listing_uuid: str) -> dict:
"""
Get full details for a specific PWCC/Fanatics Collect listing.
Args:
listing_uuid: UUID of the listing (e.g. '232c2cb0-6f25-11ed-a516-0a58a9feac02')
Returns:
Dictionary with complete listing details including description
"""
return self._call("get_listing_details", method="GET", listing_uuid=listing_uuid)
def main():
"""Practical usage example: Search for cards and get details for top results"""
client = ParseClient()
print("=" * 70)
print("PWCC / Fanatics Collect Marketplace Search")
print("=" * 70)
search_keyword = "charizard psa 10"
print(f"\nSearching for: '{search_keyword}'")
print("-" * 70)
search_results = client.search_listings(
keywords=search_keyword,
page=0,
hits_per_page=5,
status="Sold"
)
print(f"Found {search_results['total_hits']} total listings")
print(f"Showing page {search_results['page']} of {search_results['total_pages']}")
print(f"Results per page: {search_results['hits_per_page']}\n")
if not search_results['results']:
print("No results found.")
return
print(f"Top {len(search_results['results'])} listings:\n")
for idx, listing in enumerate(search_results['results'], 1):
print(f"{idx}. {listing['title']}")
print(f" Year: {listing['year']}")
print(f" Card #: {listing['card_number']}")
print(f" Grade: PSA {listing['grade']} (Cert: {listing['cert_number']})")
print(f" Status: {listing['status']}")
if listing['status'] == "Sold":
price_dollars = listing.get('purchase_price_cents', 0) / 100
print(f" Sold Price: ${price_dollars:,.2f}")
else:
bid_dollars = listing.get('current_bid_cents', 0) / 100
print(f" Current Bid: ${bid_dollars:,.2f}")
print(f" Marketplace: {listing['marketplace']}")
print()
if search_results['results']:
first_listing_uuid = search_results['results'][0]['listing_uuid']
print("-" * 70)
print(f"\nFetching detailed information for first listing...")
print(f"UUID: {first_listing_uuid}\n")
details = client.get_listing_details(first_listing_uuid)
print("Full Listing Details:")
print(f"Title: {details['title']}")
print(f"Subtitle: {details.get('subtitle', 'N/A')}")
print(f"Grade: PSA {details['grade']}")
print(f"Certification: {details['cert_number']}")
print(f"Year: {details['year']}")
print(f"Card Number: {details['card_number']}")
print(f"Category: {details.get('category', 'N/A')}")
print(f"Brand: {details['brand']}")
if 'description' in details and details['description']:
print(f"\nDescription:\n{details['description'][:500]}...")
print("\n" + "=" * 70)
print("Search and detail retrieval completed successfully!")
if __name__ == "__main__":
main()Search PWCC/Fanatics Collect marketplace listings by keywords. Returns paginated results with card details including PSA grade, certification number, prices, year, and card number. Results are sorted by relevance by default.
| Param | Type | Description |
|---|---|---|
| page | integer | Zero-based page number for pagination. |
| status | string | Filter by listing status. Accepts: Sold, Live. Omitted returns all statuses. |
| keywordsrequired | string | Search keywords for finding listings (e.g. 'charizard psa 10', 'michael jordan rookie'). |
| marketplace | string | Filter by marketplace type. Accepts: PREMIER, WEEKLY, FIXED. Omitted returns all marketplace types. |
| hits_per_page | integer | Number of results per page. |
{
"type": "object",
"fields": {
"page": "integer",
"results": "array of listing objects with card details",
"total_hits": "integer",
"total_pages": "integer",
"hits_per_page": "integer"
},
"sample": {
"page": 0,
"results": [
{
"year": 1996,
"brand": "Charizard-Holo",
"grade": 10,
"title": "1996 Pokemon Japanese Base Set Holo Charizard NO RARITY, ARITA AUTO #6 PSA 10",
"status": "Sold",
"category": "Pokémon",
"subtitle": "PSA Pop 1 of 7 - Signed On Case By Mitsuhiro Arita",
"bid_count": 35,
"image_url": "https://dilxwvfkfup17.cloudfront.net/...",
"listed_at": 1648854000,
"object_id": "PREMIER2731",
"sold_date": 1650170476,
"listing_id": 2731,
"lot_number": "PA11 Lot: 31",
"card_number": "6",
"cert_number": "24909560",
"marketplace": "PREMIER",
"auction_name": "April Premier Auction",
"listing_uuid": "232c2cb0-6f25-11ed-a516-0a58a9feac02",
"category_parent": "Trading Card Games",
"grading_service": "PSA",
"current_bid_cents": 270000,
"starting_bid_cents": 1000,
"current_price_cents": 270000,
"purchase_price_cents": 324000
}
],
"total_hits": 4235,
"total_pages": 800,
"hits_per_page": 3
}
}About the PWCC Marketplace API
What the API Returns
The PWCC Marketplace API covers graded trading cards listed on the Fanatics Collect (formerly PWCC) platform. Each result from search_listings includes the card title, PSA grade, PSA certification number, year, brand/set name, card number, listing status, and pricing information. Results are paginated — the response includes page, total_hits, total_pages, and hits_per_page fields alongside the results array. The page parameter is zero-based.
Filtering and Scoping Searches
search_listings accepts a required keywords string (e.g. charizard psa 10 or michael jordan rookie) and several optional filters. status restricts results to either Sold or Live listings; omitting it returns both. marketplace narrows to one of three auction/sale formats: PREMIER, WEEKLY, or FIXED. hits_per_page controls page size. These filters let you build targeted comparisons — for example, retrieving only sold PREMIER auction results to construct a price history for a specific card and grade.
Listing Detail Endpoint
get_listing_details accepts a listing_uuid obtained from search_listings results and returns a richer object for a single listing. Fields include slug, year, brand, grade, title, status, category, subtitle, listing_id, and card_number. A full text description is included when available. This endpoint is useful for resolving details on a specific lot before or after a sale.
Coverage Scope
The API reflects listings on the PWCC/Fanatics Collect marketplace specifically. PSA-graded cards are the primary focus, consistent with the platform's inventory. Data freshness depends on listing activity on the platform; sold listings remain queryable via the status=Sold filter, making historical price lookups viable within the available listing archive.
The PWCC Marketplace API is a managed, monitored endpoint for pwccmarketplace.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when pwccmarketplace.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 pwccmarketplace.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?+
- Build a PSA 10 price tracker for specific Pokémon cards using
status=Soldresults over time - Compare hammer prices across PREMIER vs WEEKLY auction formats for the same card and grade
- Verify PSA certification numbers for cards before purchase using the
get_listing_detailscert field - Aggregate recent sold prices for a player's rookie cards to estimate current market value
- Alert collectors when a specific card (by keyword and grade) goes Live on the marketplace
- Research year and set distribution for graded copies of a card currently available as FIXED listings
- Pull listing metadata (title, subtitle, brand, card_number) to populate a collection management tool
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does PWCC/Fanatics Collect have an official developer API?+
What does the `status` filter in `search_listings` actually distinguish?+
status=Live returns listings currently active on the marketplace, while status=Sold returns completed transactions with final sale prices. Omitting the parameter returns both. This distinction is key for separating asking prices from realized prices when doing valuation work.Does the API cover BGS (Beckett), SGC, or other grading companies, or only PSA?+
grade, certification number) are present where the listing includes them, but coverage depends on what is listed. You can fork this API on Parse and revise it to add explicit grading-company filters if needed.Is there a way to retrieve seller profiles or bidding history for a listing?+
How does pagination work in `search_listings`?+
page parameter. The response includes total_hits, total_pages, and hits_per_page so you can calculate how many requests are needed to walk through a full result set. hits_per_page can be set explicitly per request.