# Goldin Scraper (`normdata/goldin-scraper`) Actor

Goldin sold prices and live lots for card collectors, dealers and investors: 800k+ sports cards, Pokemon, comics and memorabilia sold since 2012, with final price plus buyer's premium, grader, grade, pop, bids and auction. Every filter, no 20k cap, cert numbers and photos as an add-on.

- **URL**: https://apify.com/normdata/goldin-scraper.md
- **Developed by:** [Norm Data](https://apify.com/normdata) (community)
- **Categories:** E-commerce, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $12.00 / 1,000 lots

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

![Norm Data](https://raw.githubusercontent.com/FabriAV/normdata/refs/heads/main/assets/banner_norm2.png)

## 🃏 Goldin Scraper

Extract lots from **Goldin**, the auction house for high-end sports cards, trading cards, comics and memorabilia. Get **sold prices** (more than 800,000 lots sold since 2012: what each card really went for) or **live and upcoming lots** with their current bids, in one clean table.

Each lot comes with:

- **Final price** and the **price with buyer's premium** (what the buyer actually paid, worked out the way goldin.co does it).
- **Grader, grade and grade label** (PSA GEM MT 10, BGS 9.5, CGC 9.8...), the **pop count** when the title gives it, the item's year, and **rookie**, **autographed** and **serial numbered** flags (with the print run, e.g. /25).
- Starting bid, **number of bids**, buyer's premium %, and whether a Buy Now item accepts offers.
- Auction type (Elite, Weekly, Thematic, Fixed Price), auction title, start, end and **sale date**.
- Main photo, lot link and auction link.
- Add-on: the full lot page, with the **description**, category, sub-category, item type, **cert number**, views, last bid time, listing date, seller and winner IDs, every photo and video, plus player, set and card number where Goldin lists them.

### 🎯 Who uses it?

#### 💳 Card collectors and investors

Pull every sale of a card, in every grade, with the real price paid. Track how a player's rookie cards trend month by month.

#### 🏪 Dealers and breakers

Price your inventory and consignments on real Goldin comps, then watch live auctions for cards with few bids that are about to close.

#### 📊 Price guides, apps and analysts

Feed a price database or a valuation model with clean numbers: final price, premium price, grader, grade, bids and dates for hundreds of thousands of lots.

#### 🧾 Appraisers and insurers

Back a valuation with recent sales of the same card and grade, each with its Goldin link and cert number.

### ✨ What it does

- **Sold lots or live lots.** Sold lots give the final price; live lots give the current bid and closing time (and the fixed price marketplace).
- **Search the way you think:**
  - Search terms ("michael jordan rookie", "charizard 1st edition", "ohtani"), several per run. Every word must be in the lot title, so long description boilerplate doesn't bring unrelated lots (you can turn on description matches too).
  - **64 categories**, **111 sub-categories** (Baseball, Basketball, Pokemon, Marvel, Silver Age...) and **95 item types** (single cards, sealed boxes, game-used memorabilia, comics, tickets...).
  - **30 grading companies** (PSA, Beckett, CGC, SGC, WATA...).
  - Auction type: Elite, Weekly, Thematic or Fixed Price.
- **Or paste goldin.co links:** a lot page, or a whole auction (every lot in it). The filters are ignored with links.
- **Every useful filter:**
  - **Price** and **year** ranges.
  - **Sold date range**: exact dates, or periods like "30 days" or "6 months".
  - 7 sort orders: most recent sale (or ending soonest), highest and lowest price, most and fewest bids, most viewed, newly listed.
- **Extra filters:** title words to include or exclude, **grade range** (for example 9.5 to 10), **rookie cards only**, **autographed only**, **max print run** (25 keeps /25, /10 and 1/1 cards), bid count range (0 finds live lots nobody has bid on).
- **New lots only.** For scheduled runs: saves only lots the same search has not saved before.

### 🏆 Why this scraper

- **No 20,000 result cap.** Goldin lists at most 20,000 lots per search. Past that, this scraper reads the search one auction at a time (and in price bands for the biggest ones), so you can pull **every** matching sale.
- **The price the buyer paid.** Besides the hammer price you get `priceWithPremium`, using Goldin's own rules (the premium changed in June 2024, and small lots have a flat fee).
- **Grades as numbers.** Grader, grade, label, pop, print run, rookie and autograph flags are split out of the title, ready to filter and chart.
- **Fast.** About 1,000 lots in 5 seconds (1,000 with full details in about 40 seconds).
- **No proxy needed.** Nothing extra to set up or pay for.

### ⚖️ How it compares

Based on each Actor's public input options (October 2026).

| Capability | This actor | [jungle_synthesizer](https://apify.com/jungle_synthesizer/goldin-auctions-marketplace-scraper) | [getascraper](https://apify.com/getascraper/goldin-auctions-scraper) | [automation-lab](https://apify.com/automation-lab/goldin-auction-lots-scraper) | [lulzasaur](https://apify.com/lulzasaur/goldin-scraper) | [123webdata](https://apify.com/123webdata/goldin-scraper) |
|---|:--:|:--:|:--:|:--:|:--:|:--:|
| Search terms | **several per run, title matched** | one | one | one | yes | links only |
| Sold lots | **yes** | yes | yes | links only | not stated | links only |
| Live lots | **yes** | yes | yes | yes | yes | yes |
| Lot links | **yes** | yes | no | yes | no | yes |
| Whole auction links | **yes** | no | no | no | no | category links |
| Categories, sub-categories, item types | **yes** | sport only | no | no | no | no |
| Grading company filter | **30** | yes | yes | no | no | no |
| Auction type filter | **yes** | yes | yes | no | no | no |
| Price range | **yes** | yes | yes | no | no | no |
| Year range | **yes** | no | yes | no | no | no |
| Sold date range | **yes** | yes | no | no | no | no |
| Grade range | **yes** | no | no | no | no | no |
| Rookie, autograph and print run filters | **yes** | no | no | no | no | no |
| Rookie and serial number fields | **yes** | no | yes | no | no | no |
| Bid count range, title words | **yes** | no | no | no | no | no |
| Sort orders | **7** | none | none | none | none | none |
| Price with buyer's premium | **yes** | yes | yes | no | no | yes |
| Full lot page (description, cert, photos) | **add-on** | no | no | descriptions | yes | yes |
| Past 20,000 results | **yes** | no | yes | no | no | no |
| New lots only (monitoring) | **yes** | no | new or changed | no | no | no |

### 📦 What data you get

| Field | Description |
| --- | --- |
| `image` | Main photo. |
| `lotId`, `lotNumber`, `title`, `status` | The lot as listed. `status` is `sold`, `live`, `upcoming` or `unsold`. |
| `year` | The item's year (card season start, issue year). |
| `grader`, `grade`, `gradeLabel` | Grading company, numeric grade (1 to 10) and the label as written, e.g. `GEM MT 10` or `Authentic`. |
| `population` | Pop count when the title gives it ("Pop 1"). |
| `numbered`, `printRun` | Serial numbering from the title, e.g. `10/25` and print run `25` (`1/1` for one of ones). |
| `price` | Final price for sold lots, current bid or asking price for live lots, in USD, before the premium. |
| `priceWithPremium`, `buyerPremiumPct` | What the buyer pays with Goldin's buyer's premium, and the premium %. |
| `startingBid`, `bids` | Opening bid and number of bids. |
| `auctionType`, `auctionTitle`, `auctionId` | Elite, Weekly, Thematic or Fixed Price, and the auction. |
| `description`, `category`, `subCategory`, `itemType` | Full lot details (add-on). |
| `sport`, `player`, `setName`, `setNumber`, `parallel` | Card details where Goldin lists them (add-on; mostly on PSA Vault lots). |
| `certNumber`, `serialNumber`, `sellerId`, `topBidderId` | Grading cert number, Goldin's item serial, the consignor's anonymous ID and the winner's (sold) or top bidder's (live) anonymous ID (add-on). |
| `views`, `viewsLastDay`, `imageCount` | Page views and number of photos (add-on). |
| `searchedFor` | Which of your searches or links found it. |
| `rookie`, `autographed` | Rookie card ("Rookie" or "RC" in the title); signed or autographed item. |
| `allowOffers`, `vaultEligible` | Buy Now item accepts offers; item can stay in the Goldin vault (add-on). |
| `url`, `auctionUrl` | Lot page and auction page. |
| `tags`, `images`, `videos` | Goldin tags, every photo and video (add-on). |
| `startsAt`, `endsAt`, `soldAt`, `lastBidAt`, `listedAt` | Lot start and end, sale date, last bid and when the lot was listed on Goldin (UTC). |
| `scrapedAt` | When the row was collected (UTC). |

Add-on fields only appear when **Full lot details** is on.

#### Example row (trimmed)

```json
{
  "image": "https://d2tt46f3mh26nl.cloudfront.net/public/Lots/202609-2219-2608-88f934e6-6d0f-40f5-a291-86625557dc47/17ea57bf-f63e-4863-b657-666ce775a2a4@2x",
  "lotNumber": 1096,
  "title": "1986-87 Fleer #57 Michael Jordan Rookie Card - PSA EX 5",
  "status": "sold",
  "year": 1986,
  "grader": "PSA",
  "grade": 5,
  "gradeLabel": "EX 5",
  "rookie": true,
  "autographed": false,
  "price": 7038,
  "priceWithPremium": 8586.36,
  "buyerPremiumPct": 22,
  "startingBid": 10,
  "bids": 47,
  "auctionType": "Weekly",
  "auctionTitle": "2026 Weekly Auction Sep 29 - Oct 8",
  "category": "Sport",
  "subCategory": "Basketball",
  "itemType": "Single Cards",
  "certNumber": "160188470",
  "views": 2560,
  "url": "https://goldin.co/item/1986-87-fleer-57-michael-jordan-rookie-card-psa-ex-56iv6x",
  "auctionUrl": "https://goldin.co/auction/2026-weekly-auction-sep-29-oct-8q9mnv",
  "soldAt": "2026-10-09T02:45:58.000Z",
  "scrapedAt": "2026-10-10T23:51:51.661Z"
}
```

### 💡 Use cases

#### 📈 Every PSA 10 Shohei Ohtani card sold in the last year

```json
{ "searchTerms": ["ohtani"], "graders": ["PSA"], "minGrade": 10, "soldFrom": "1 year", "maxItems": null }
```

#### 🔥 Top 500 Pokemon sales of all time

```json
{ "subCategories": ["Pokemon"], "sortBy": "price_high", "maxItems": 500 }
```

#### 🏀 Vintage basketball cards (1948 to 1980) that sold for $1,000 to $10,000

```json
{ "subCategories": ["Basketball"], "itemTypes": ["Single Cards"], "yearFrom": 1948, "yearTo": 1980, "minPrice": 1000, "maxPrice": 10000, "maxItems": null }
```

#### 🔔 New live Charizard lots with no bids yet, every morning

```json
{ "status": "live", "searchTerms": ["charizard"], "maxBids": 0, "onlyNew": true, "maxItems": null }
```

#### 📚 Every lot of one auction, with full details

```json
{ "urls": ["https://goldin.co/auction/2026-weekly-auction-sep-29-oct-8q9mnv"], "includeDetails": true, "maxItems": null }
```

### ⚙️ How the input is organised

| Section | What it's for |
| --- | --- |
| **Maximum lots** and **What to scrape** | Always first: caps the whole run (shared across your searches; empty means no limit), and sold or live lots. |
| **What** | Search terms, links, categories, sub-categories, item types, graders, auction type. |
| **Price, year and dates** | Price, year and sold date ranges, and the sort order. |
| **Extra filters** | Title words, grade range, rookies, autographs, print run, bid count range. |
| **Add-ons** | Full lot details. |
| **Monitoring** | New lots only, with an optional monitor name. |

Each search term is one search; every filter narrows all of them. With links, the search terms and filters are ignored.

### 💰 Pricing

Pay-per-event: a one-time **$0.003** when the run starts, plus a price per lot saved to your dataset that drops with your Apify plan. Full lot details are an optional add-on per lot.

| Your Apify plan | Per lot | With full details | 1,000 lots | 1,000 lots with details |
| --- | --- | --- | --- | --- |
| Free | $0.018 | +$0.005 | $18.00 | $23.00 |
| Bronze | $0.016 | +$0.0045 | $16.00 | $20.50 |
| Silver | $0.014 | +$0.004 | $14.00 | $18.00 |
| Gold / Platinum / Diamond | $0.012 | +$0.0035 | $12.00 | $15.50 |

Lots dropped by your filters are not charged. There are no proxy costs. New Apify accounts start with $5 in free credit. On the Free plan a run saves up to 10 lots.

**Speed:** about 1,000 lots in 5 seconds; 1,000 with full details in about 40 seconds.

### 🚀 Run it

1. Create a free Apify account with $5 in credit.
2. Open the Goldin Scraper.
3. Type a search term (or keep the prefilled one), pick sold or live lots and your filters, then click **Start**.
4. Export the results as CSV, Excel, JSON, or XML from the Dataset tab.

You can also:

- Run it programmatically through the Apify API (`run-sync-get-dataset-items`) or the ApifyClient for JavaScript and Python.
- Schedule it with Apify's built-in Scheduler, with **New lots only** on, to catch new lots every day.

### 🤖 Use with AI agents (MCP)

Give an AI agent live access to Goldin prices through the Model Context Protocol:

```
claude mcp add --transport http apify "https://mcp.apify.com?tools=normdata/goldin-scraper"
```

Then prompt it in plain language, for example "what have PSA 10 Wembanyama Prizm rookies sold for on Goldin this year?".

### 🔧 Troubleshooting

**The log says "More than 20,000 results".**
That's normal. Goldin lists at most 20,000 lots per search, so the rest is read one auction at a time, newest first. Past the first 20,000, rows come auction by auction.

**A search returns fewer lots than goldin.co.**
Goldin also matches words in the lot description, often boilerplate (a magazine lot can mention "Michael Jordan" in its standard text). By default every word of your term must be in the title. Turn on **Match words in descriptions too** to keep everything Goldin matches.

**Some rows have no grade.**
The item is raw, authenticated only ("Authentic"), or graded on a scale the title doesn't give as a number. Set a grade range to keep only numeric grades.

**A row has an `error` field.**
Only with the add-on, and only when that lot's page could not be loaded: the search fields are filled, the add-on fields are empty and `error` says why. Rows that worked have no `error`. With the add-on off, its fields are left out of the rows.

**Player, set or card number are empty.**
Goldin fills them only for some lots (mostly PSA Vault items). The title always has the full card name.

**A scheduled "New lots only" run saved nothing.**
Nothing new matched since the last run. Changing terms, links or filters starts a fresh memory; set a **Monitor name** to keep it.

### ❓ FAQ

| Question | Answer |
| --- | --- |
| Do I need a Goldin account? | No. Only public lot data is read. |
| Does the price include the buyer's premium? | `price` doesn't; `priceWithPremium` does. |
| How far back do sold lots go? | To 2012, more than 800,000 lots. |
| Is there a result limit? | No. Leave the maximum empty to get the whole search, even past 20,000. |
| Does it need a proxy? | No. |
| Can I track new lots? | Yes. Turn on **New lots only** and schedule the run. |

### 🛡️ Limits & responsible use

This Actor reads only public lot data shown on Goldin. It never signs in and never bids. Use the data in line with Goldin's terms.

### 📧 Contact

Need a scraper for a different site, or found something wrong with this one? norm.data.scrapers@gmail.com

### 🧪 Local development

```powershell
bun install
bun run typecheck
bun test/qa.mjs
apify run
```

Local results are stored in `storage/datasets/default`.

# Actor input Schema

## `maxItems` (type: `integer`):

Stop after this many lots in total. Leave empty for no limit (every matching lot, even past the 20,000 results Goldin lists per search). The Apify Free plan is always capped at 10.

## `status` (type: `string`):

Sold lots are past sales with the final price (prices realized), back to 2012: about 800,000 lots. Live lots are open for bidding now (with the current bid) or for sale in the fixed price marketplace.

## `searchTerms` (type: `array`):

One search per line, e.g. "michael jordan rookie", "charizard 1st edition", "ohtani". Leave empty to browse everything (narrowed by the filters below).

## `matchDescriptions` (type: `boolean`):

Off: every word of a search term must be in the lot title (Goldin also matches long description boilerplate, which brings unrelated lots). On: keep everything Goldin matches.

## `urls` (type: `array`):

Lot pages (goldin.co/item/...) or whole auctions (goldin.co/auction/...: every lot in the auction). The filters are ignored with links.

## `categories` (type: `array`):

Keep only lots in ANY of these Goldin categories.

## `subCategories` (type: `array`):

Keep only ANY of these: sport (Baseball, Basketball, Football, Soccer...), game (Pokemon, Magic...) or comic era.

## `itemTypes` (type: `array`):

Keep only ANY of these: single cards, memorabilia, comics, sealed boxes, tickets, video games...

## `graders` (type: `array`):

Keep only items graded by ANY of these (as Goldin lists them).

## `auctionType` (type: `string`):

Keep only one kind of sale.

## `minPrice` (type: `integer`):

Final price for sold lots, current bid or asking price for live lots.

## `maxPrice` (type: `integer`):

Same price as "Min price".

## `yearFrom` (type: `integer`):

Year of the item (card season, issue year), e.g. 1952.

## `yearTo` (type: `integer`):

e.g. 1989.

## `soldFrom` (type: `string`):

Sold lots only: sold on or after this date. A date like "2025-01-01", or a period like "30 days" or "6 months".

## `soldTo` (type: `string`):

Same format as "Sold from", e.g. "2025-12-31".

## `sortBy` (type: `string`):

Order of the results. Matters most when you set a Maximum.

## `titleIncludes` (type: `array`):

Keep only lots whose title contains ANY of these words, e.g. "rookie", "auto", "1/1", "pop 1". Not case sensitive.

## `titleExcludes` (type: `array`):

Drop lots whose title contains any of these words, e.g. "lot of", "collection", "reprint".

## `minGrade` (type: `number`):

Keep only graded items with at least this grade, from 1 to 10, e.g. 9.5. Ungraded items are dropped when a grade range is set.

## `maxGrade` (type: `number`):

Keep only graded items with at most this grade.

## `minBids` (type: `integer`):

Keep only lots with at least this many bids.

## `maxBids` (type: `integer`):

Keep only lots with at most this many bids. 0 finds live lots nobody has bid on yet.

## `rookiesOnly` (type: `boolean`):

Keep only lots with "Rookie" or "RC" in the title.

## `autographedOnly` (type: `boolean`):

Keep only signed or autographed items ("Signed", "Auto", "Autograph" in the title).

## `maxPrintRun` (type: `integer`):

Keep only serial numbered cards with a print run up to this, e.g. 25 keeps /25, /10, /5 and 1/1 cards.

## `includeDetails` (type: `boolean`):

Add the lot page to every lot: full description, category, item type, cert number, views, last bid time, listing date, seller and winner IDs, every photo and video, plus player, set and card number where Goldin lists them. Charged as an add-on per lot.

## `onlyNew` (type: `boolean`):

For scheduled runs: save only lots this same search has not saved before. The first run saves everything; later runs save just what is new. Kept per search (terms, links and filters).

## `monitorName` (type: `string`):

Optional. Give "New lots only" a fixed name to keep its memory even after you change the filters.

## Actor input object example

```json
{
  "maxItems": 10,
  "searchTerms": [
    "michael jordan rookie"
  ]
}
```

# Actor output Schema

## `lots` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "maxItems": 10,
    "searchTerms": [
        "michael jordan rookie"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("normdata/goldin-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "maxItems": 10,
    "searchTerms": ["michael jordan rookie"],
}

# Run the Actor and wait for it to finish
run = client.actor("normdata/goldin-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "maxItems": 10,
  "searchTerms": [
    "michael jordan rookie"
  ]
}' |
apify call normdata/goldin-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,normdata/goldin-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/BPtG9MyR8KI6rtgrB/builds/cMoGeEKLYUNlcjRJe/openapi.json
