SCP Auctions APIcatalogs.scpauctions.com ↗
Search and retrieve past SCP Auctions lot data: final prices, bid counts, grades, graders, sale dates, and sold/unsold status via 2 endpoints.
What is the SCP Auctions API?
The SCP Auctions Catalog API gives programmatic access to completed sports card and memorabilia auction lots on catalogs.scpauctions.com through 2 endpoints. Use search_sales to query past lots by keyword with filtering by sold/unsold status and sorting that mirrors the site's own order, or use get_lot to pull the full record for any individual lot URL — including final price, bid count, parsed grader and grade, and lot close date.
curl -X GET 'https://api.parse.bot/scraper/e55ab4c1-095c-4aac-987a-d141bd1b8fda/search_sales?sort=relevance&query=Michael+Jordan+PSA+10&status=any' \ -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 catalogs-scpauctions-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: SCP Auctions SDK — search past lots, drill into detail."""
from parse_apis.catalogs_scpauctions_com_api import (
ScpAuctions, SearchSort, SaleStatusFilter, LotNotFound,
)
client = ScpAuctions()
# Search sold Jordan rookie cards, sorted by price descending.
for lot in client.lots.search(
query="Michael Jordan rookie",
status=SaleStatusFilter.SOLD,
sort=SearchSort.PRICE_DESC,
limit=5,
):
print(f"{lot.title} — ${lot.final_amount:,.0f}" if lot.final_amount else lot.title)
# Drill into the top result for full detail via its URL.
top = client.lots.search(
query="Michael Jordan PSA 10",
sort=SearchSort.RELEVANCE,
limit=1,
).first()
if top is not None:
detail = client.lots.get(url=top.url)
print(detail.title, detail.status, detail.grade)
print("Bids:", detail.bid_count, "| Auction:", detail.auction_name)
# Refresh to re-fetch the same lot.
refreshed = detail.refresh()
print("Refreshed price:", refreshed.final_amount)
# Typed error handling for an invalid lot URL.
try:
client.lots.get(url="https://catalogs.scpauctions.com/online-auctions/scp-auctions-inc/nonexistent-0")
except LotNotFound as e:
print("Lot not found:", e.message)
print("exercised: lots.search / lots.get / lot.refresh / LotNotFound")
Searches SCP Auctions' catalog of past (ended) lots by keyword and returns up to 5 fully resolved lot records per call, in the site's own order for the chosen sort. One search request plus one lot-page request per returned record (max 6 requests). Each record has the same shape as get_lot: status is exactly one of sold, not_sold, ended_unknown (auction ended but the site shows neither a sold price nor an Unsold label), or not_ended; an ended auction alone never yields sold. final_amount, currency, price_basis and buyer_premium_included are populated only for sold lots and are null otherwise; buyer_premium_rate is always null because the site does not publish the rate on lot pages. sale_date/sale_datetime is the lot page's own close time (with UTC offset) and is never taken from the site's current headline dates; sale_date_precision is datetime when it is present. grader/grade are parsed from the lot title (grade_source is title) and null when the title carries no recognizable grade. Pagination: page selects the next block of `limit` records; has_more is true while the site's total_results exceeds the records consumed so far. total_results is the site's own count for the query and status filter. failed_lots lists any lot pages that could not be fetched or parsed for this page. A query with no matches returns an empty results list.
| Param | Type | Description |
|---|---|---|
| page | integer | 1-based page of `limit` records over the search result stream. |
| sort | string | Result ordering, mirroring the site's Sort By menu. |
| limit | integer | Number of lot records to return, 1 to 5; larger values are clamped to 5. |
| queryrequired | string | Free-text keyword search over lot titles and descriptions (one shape: a player name plus set or grade words). |
| status | string | Restricts results to past lots that sold, went unsold, or either. |
{
"type": "object",
"fields": {
"page": "page number served",
"limit": "effective page size after clamping to 5",
"query": "echo of the search keywords",
"results": "array of lot records, same shape as get_lot data",
"has_more": "true when more records exist beyond this page",
"failed_lots": "array of {url, status_code, error?} for lot pages that could not be fetched or parsed",
"status_filter": "status filter applied (any, sold, unsold)",
"total_results": "site-reported total matching lots for the query and status filter; null if the site omitted it"
},
"sample": {
"data": {
"page": 1,
"limit": 2,
"query": "Michael Jordan PSA 10",
"results": [
{
"id": "9394841",
"url": "https://catalogs.scpauctions.com/online-auctions/scp-auctions-inc/1986-fleer-57-michael-jordan---psa-gem-mint-10-9394841",
"grade": "GEM MINT 10",
"title": "1986 Fleer #57 Michael Jordan - PSA GEM MINT 10",
"grader": "PSA",
"status": "sold",
"currency": "USD",
"bid_count": 15,
"image_url": "https://s1.img.bidsquare.com/item/xl/3810/38105385.jpeg",
"sale_date": "2026-07-26",
"auction_id": "23246",
"lot_number": "3",
"auction_url": "https://catalogs.scpauctions.com/auctions/scp-auctions-inc/2026-summer-premier-23246",
"description": "This 1986 Fleer #57 Michael Jordan rookie card grades PSA GEM MINT 10, the highest grade on the PSA scale.",
"price_basis": "sold_price_including_buyer_premium",
"auction_name": "2026 Summer Premier",
"final_amount": 360000,
"grade_source": "title",
"status_label": "Sold for",
"sale_datetime": "2026-07-26T22:30:00-04:00",
"currency_symbol": "$",
"sale_date_source": "lot_page_auction_close_time",
"auction_dates_text": "Thu, Jul 9, 2026 12:00PM CDT - Sun, Jul 26, 2026 09:30PM CDT",
"buyer_premium_note": "Sold Price includes BP",
"buyer_premium_rate": null,
"final_amount_label": "Sold for",
"sale_date_precision": "datetime",
"buyer_premium_included": true
},
{
"id": "6742678",
"url": "https://catalogs.scpauctions.com/online-auctions/scp-auctions-inc/sensational-1984-star-101-xrc-michael-jordan-autographed-true-rookie---bgs-nm-mt-8-5-beckett-9-auto-one-of-highest-dual-grades-in-hobby-6742678",
"grade": "NM-MT+ 8.5",
"title": "Sensational 1984 Star #101 XRC Michael Jordan Autographed True Rookie - BGS NM-MT+ 8.5, Beckett 9 Auto. (One of Highest Dual Grades in Hobby!)",
"grader": "BGS",
"status": "sold",
"currency": "USD",
"bid_count": 19,
"image_url": "https://s1.img.bidsquare.com/item/xl/2823/28233694.jpeg",
"sale_date": "2024-11-23",
"auction_id": "16485",
"lot_number": "4",
"auction_url": "https://catalogs.scpauctions.com/auctions/scp-auctions-inc/2024-fall-premier-16485",
"description": "Presented here is one of the finest signed versions of MJ's first rookie card you will find in the hobby.",
"price_basis": "sold_price_including_buyer_premium",
"auction_name": "2024 Fall Premier",
"final_amount": 312000,
"grade_source": "title",
"status_label": "Sold for",
"sale_datetime": "2024-11-23T22:30:00-05:00",
"currency_symbol": "$",
"sale_date_source": "lot_page_auction_close_time",
"auction_dates_text": "Wed, Nov 6, 2024 12:00PM CST - Sat, Nov 23, 2024 09:30PM CST",
"buyer_premium_note": "Sold Price includes BP",
"buyer_premium_rate": null,
"final_amount_label": "Sold for",
"sale_date_precision": "datetime",
"buyer_premium_included": true
}
],
"has_more": true,
"failed_lots": [],
"status_filter": "sold",
"total_results": 280
},
"status": "success"
}
}About the SCP Auctions API
What the API Covers
Both endpoints return the same lot record shape: title, id, url, status, sale_date, bid_count, image_url, currency, grade, and grader. The status field is one of four values — sold, not_sold, ended_unknown, or not_ended — distinguishing between a confirmed sale, a lot that went unsold, an ended auction where the page shows neither outcome, and an auction that has not yet closed. final_amount reflects the hammer price on which buyer premium is calculated, and currency is only populated when status is sold.
search_sales Endpoint
search_sales accepts a required query string (player name, set name, grade keywords, or any combination), an optional status filter (any, sold, or unsold), a sort parameter matching the site's Sort By menu options, and page/limit parameters for pagination. Up to 5 fully resolved lot records are returned per call. The response includes total_results (the site-reported count of matching lots, or null if omitted), has_more to detect additional pages, and failed_lots — an array of lot URLs that could not be fetched or parsed in that call, each with a status_code and optional error message.
get_lot Endpoint
get_lot takes a single url input — a full lot page URL on catalogs.scpauctions.com — and returns one lot record. This is useful when you already have a URL from a prior search_sales result or from the site itself. The grader field parses grading company abbreviations such as PSA, SGC, BGS, or CGC directly from the lot title, and grade captures the grade text including any descriptor (for example, GEM MINT 10). Both fields are null when grading information is absent from the title.
Limitations
Results are limited to past (ended) lots in SCP Auctions' public catalog. The limit parameter is clamped to a maximum of 5, so retrieving large result sets requires sequential pagination using the page parameter. bid_count is null when the lot page does not display that figure.
The SCP Auctions API is a managed, monitored endpoint for catalogs.scpauctions.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when catalogs.scpauctions.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 catalogs.scpauctions.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?+
- Track realized prices for graded PSA and BGS cards by querying
search_saleswith a player name and grade keywords - Build a comps database by collecting
final_amount,sale_date, andbid_countacross multiple paginated result pages - Identify unsold lots using the
statusfilter to find items that failed to meet reserve - Parse
graderandgradefields to compare average realized prices across different grading companies for the same card - Monitor individual lot outcomes by polling
get_lotwith a known URL untilstatuschanges fromnot_ended - Aggregate historical auction data by sport or player for collectibles valuation models
| 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 SCP Auctions offer an official developer API?+
What does the `status` field in `get_lot` actually distinguish?+
status has four possible values. sold means a final price is confirmed. not_sold means the lot ended without a sale. ended_unknown means the auction ended but the page shows neither a price nor an Unsold label — the outcome cannot be determined from the available data. not_ended means the auction is still open. A lot appearing in the past catalog alone is not sufficient to mark it as sold.Does the API cover active (live or upcoming) SCP Auctions lots?+
How does pagination work across large result sets?+
page parameter in search_sales to step through results, and check has_more to determine whether additional pages exist. The total_results field gives the site-reported total matching count, though it may be null if the site did not include that figure. Each call returns at most 5 records regardless of the limit input.Are lot descriptions or condition notes included in the response?+
title, grade, grader, status, final_amount, sale_date, bid_count, image_url, currency, id, and url, but does not include full lot description text or condition report fields. You can fork this API on Parse and revise it to extract those fields from the lot page.