# Reverb Sold Listings (`maximedupre/reverb-sold-listings`) Actor

Collect historical Reverb sold listings from one musical-gear keyword or marketplace search URL. Get listing IDs, titles, prices, conditions, sellers, dates, and source links in a structured dataset.

- **URL**: https://apify.com/maximedupre/reverb-sold-listings.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** E-commerce, Business, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$5.00 / 1,000 sold listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### 🎸 Reverb sold listings for musical gear

Musical-gear sellers, collectors, and researchers can search Reverb for historical sold listings. The Actor returns one structured row per eligible listing with its Reverb ID, title, canonical page, sold amount and currency when Reverb provides them, condition, gear details, seller, and source dates. Use the rows to compare past sale amounts for one search; the Actor does not calculate model-level values or promise every historical sale.

**Use cases**

- Search Reverb with **[Reverb Price Guide](https://apify.com/maximedupre/reverb-sold-listings/examples/reverb-price-guide)** to collect sold listings; the Actor returns source records, not a model-level valuation.
- Search Reverb with **[Blue Book of Guitar Values](https://apify.com/maximedupre/reverb-sold-listings/examples/blue-book-of-guitar-values)** to find related sold listings, not a blue-book estimate.
- Find historical Reverb records with **[Guitar Sold Listings](https://apify.com/maximedupre/reverb-sold-listings/examples/guitar-sold-listings)** and save one row per eligible listing.
- Compare used-gear sold amounts with **[Used Guitar Prices](https://apify.com/maximedupre/reverb-sold-listings/examples/used-guitar-prices)**, including currencies, conditions, and source links.
- Search Reverb with **[How Much Is My Guitar Worth Serial Number](https://apify.com/maximedupre/reverb-sold-listings/examples/how-much-is-my-guitar-worth-serial-number)** to find matching sold records, not an automatic value.
- Build a view of **[Reverb Price History](https://apify.com/maximedupre/reverb-sold-listings/examples/reverb-price-history)** from sold amounts, conditions, sellers, and listing dates when shown.
- Use **[Vintage Guitar Price Guide 2026](https://apify.com/maximedupre/reverb-sold-listings/examples/vintage-guitar-price-guide-2026)** as a Reverb search phrase to find matching vintage-gear sold listings; no 2026 valuation is calculated.

#### 📦 Reverb sold-listing rows you can use

Each saved row represents the first eligible match for one Reverb listing. It includes the source link and core listing details, plus optional gear, price, shipping, seller, media, time, and status fields when Reverb shows them. If the same listing appears again through another submitted value, later matches are skipped.

**Useful data**

- Compare sold amounts with their currencies.
- Filter or group by manufacturer, model, year, finish, category, or condition.
- Keep the Reverb listing link, seller and shop names, image link, and source timestamps with each row.
- Check source status, sold state, quantity, offers, and auction status when those values are available.

#### 🚀 Run a Reverb sold-listing search

1. Choose **Keyword search** and enter one musical-gear query, or choose **Search URL** and paste one Reverb marketplace search URL.
2. Choose **All conditions**, **Used**, or **New**.
3. Set **Maximum results** if you want a limit. Leave it empty to return all available results until the source is exhausted.
4. Start the run and open the linked dataset when it finishes.

**Search rules**

Only the fields for the selected **Target** are used. A keyword search uses `query`; a URL search uses `searchUrl`. The other field is ignored. `maxItems` must be 1 or more when set, and the public schema has no fixed upper limit.

#### ⚙️ Input

Choose one target, then fill in the field used by that target.

**Input fields**

| Field | Type | What it does |
| --- | --- | --- |
| `target` | string, required | Selects **Keyword search** or **Search URL**. Only fields for the selected Target are used. |
| `query` | string | One free-text musical-gear query for Keyword search. It is ignored for Search URL. |
| `searchUrl` | string | One Reverb marketplace search URL for Search URL. It is ignored for Keyword search. |
| `condition` | string | Keeps **all**, **used**, or **new** listings. |
| `maxItems` | integer | Stops after this many sold listings. Leave it empty to return all available results until the source is exhausted. It must be at least 1 when set. |

**Successful default-input example**

The example below is the public input from a successful current-beta run.

```json
{
  "target": "keyword",
  "query": "Fender Stratocaster",
  "condition": "all",
  "maxItems": 20
}
```

#### 🧾 Output

The run output links to the dataset. The dataset uses the `overview` view and contains one object for each saved sold listing.

**Run output**

| Field | Type | What it does |
| --- | --- | --- |
| `dataset` | string (URL) | Opens the run's Reverb sold-listings dataset in the `overview` view. |

**Dataset row fields**

| Field | Type | What it does |
| --- | --- | --- |
| `listingId` | string | Reverb's ID for the sold listing. Required. |
| `title` | string | The listing title. Required. |
| `listingUrl` | string (URL) | The canonical Reverb page for the listing. Required. |
| `manufacturer` | string | The gear maker shown by Reverb, when available. |
| `model` | string | The gear model shown by Reverb, when available. |
| `year` | integer | The gear year shown by Reverb, when available. |
| `finish` | string | The gear finish shown by Reverb, when available. |
| `categoryPath` | array of strings | The Reverb category path for the listing. |
| `condition` | string | The human-readable condition shown by Reverb, when available. |
| `conditionCode` | string | The machine-readable condition value from Reverb, when available. |
| `price` | number | The sold listing amount, when Reverb provides it. |
| `currency` | string | The currency for the sold amount, when Reverb provides it. |
| `shippingCost` | number | The shipping cost, when Reverb provides it. |
| `shippingCurrency` | string | The currency for the shipping cost, when Reverb provides it. |
| `isFreeShipping` | boolean | Whether Reverb marks shipping as free, when provided. |
| `sellerName` | string | The seller name shown by Reverb, when available. |
| `shopName` | string | The shop name shown by Reverb, when available. |
| `imageUrl` | string (URL) | The primary listing image link, when available. |
| `createdAt` | ISO date-time string | The time Reverb created the listing, when available. |
| `publishedAt` | ISO date-time string | The time Reverb published the listing, when available. |
| `listingStatus` | string | The listing state reported by Reverb, when available. |
| `isSold` | boolean | Whether Reverb marks the listing as sold, when provided. |
| `quantity` | integer | The available quantity reported by Reverb, when provided. |
| `offersEnabled` | boolean | Whether offers are enabled, when provided. |
| `auctionStatus` | string | The auction state reported by Reverb, when provided. |

Fields that Reverb does not show are omitted from that row. The row below is a complete, genuine row from the successful current-beta run; it is not a valuation.

```json
{
  "listingId": "76731931",
  "title": "Fender custom shop Rory Gallagher signature Stratocaster Fender Stratocaster 2011 - Sunburst",
  "listingUrl": "https://reverb.com/item/76731931-fender-custom-shop-rory-gallagher-signature-stratocaster-fender-stratocaster-2011-sunburst",
  "manufacturer": "Fender custom shop Rory Gallagher signature Stratocaster",
  "model": "Fender Stratocaster",
  "year": 2011,
  "finish": "Sunburst",
  "categoryPath": [
    "Electric Guitars"
  ],
  "condition": "Excellent",
  "conditionCode": "excellent",
  "price": 3800,
  "currency": "USD",
  "isFreeShipping": false,
  "sellerName": "Rick's Shop",
  "shopName": "Rick's Shop",
  "imageUrl": "https://rvb-img.reverb.com/i/s--Jtu0U9Sm--/quality=medium-low,height=400,width=400,fit=cover,gravity=bottom/byqpkywlrgrxk9uikbca.jpg",
  "createdAt": "2023-12-04T19:27:13.000Z",
  "publishedAt": "2023-12-04T19:39:38.000Z",
  "listingStatus": "Sold",
  "isSold": true,
  "quantity": 0,
  "offersEnabled": true
}
```

#### 💳 Pricing

**Price**

Each saved historical sold listing costs `$0.005`. The charge applies when a sold listing is saved; a run with no saved listing does not create this event.

**Buyer note**

There is no separate setup or start charge in this Actor's public pricing. The amount covers the sold listings saved in the dataset.

#### 🔌 Integrations

**Video**

https://www.youtube.com/watch?v=bNACk1\_S\_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

**Ways to use the data**

Run the Actor in Apify Console or through the Apify API. Use the dataset link in the run output to read the structured rows in your own workflow.

#### ❓ FAQ

##### How do I view sold items from Reverb?

Choose **Keyword search** and enter a musical-gear phrase, or choose **Search URL** and paste one Reverb marketplace search URL. Start the run, then open the linked dataset to view the saved rows.

##### Can I paste a Reverb marketplace URL?

Yes. Select **Search URL** and paste one URL that matches the Reverb marketplace format. The `query` field is ignored for this target.

##### Does this give me a price guide or tell me what my gear is worth?

No. It returns historical sold-listing records with source prices when Reverb provides them. It does not calculate a model-level valuation or promise a price for every item.

##### What happens when I leave Maximum results empty?

The run returns all available results until the source is exhausted. A set limit stops the run after that many saved sold listings.

##### Will every row contain every field?

No. `listingId`, `title`, and `listingUrl` are required. Other fields are included when Reverb provides them, so optional values can be missing.

##### How does the Actor handle the same listing found twice?

It saves the first eligible match and skips later matches for the same Reverb listing. The saved row keeps the first match's source context; it does not merge later matches.

##### Do I need a Reverb login or API key?

No. The input does not ask for Reverb credentials. The Actor uses public Reverb data.

##### Can I choose used or new listings?

Yes. Set **Condition** to **All conditions**, **Used**, or **New** before you start the run.

### 📝 Changelog

**0.0: Initial release**

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~reverb-sold-listings/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- [**Discogs**](https://apify.com/maximedupre/discogs) — Search music releases and inspect marketplace offers and current asking prices.
- [**Reverb Musical Instruments Marketplace Scraper**](https://apify.com/automation-lab/reverb-musical-instruments-marketplace-scraper) — Collect current Reverb gear listings with prices, sellers, shipping, and photos.
- [**eBay Scraper - Listings, Sold Prices & Seller Leads**](https://apify.com/scrapesage/ebay-scraper) — Compare eBay active listings, sold prices, and seller data for a broader market view.
- [**Reverb Marketplace Listings Scraper**](https://apify.com/jungle_synthesizer/reverb-marketplace-listings-api-scraper) — Search live Reverb listings by gear keyword, category, or condition.
- [**Reverb Scraper - Music Gear Listings & Prices**](https://apify.com/jongoose/reverb-scraper) — Gather live Reverb gear listings with price, condition, seller, photo, and category data.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

## `target` (type: `string`):

Choose a keyword search or a Reverb marketplace search URL. Only the fields for the selected Target are used.

## `query` (type: `string`):

Enter one musical-gear search phrase. Used for Keyword search and ignored for Search URL.

## `searchUrl` (type: `string`):

Paste one Reverb marketplace search URL. Used for Search URL and ignored for Keyword search.

## `condition` (type: `string`):

Choose all, used, or new listings.

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

Stop after this many sold listings. Leave it empty to return all available results until the source is exhausted.

## Actor input object example

```json
{
  "target": "keyword",
  "query": "Fender Stratocaster",
  "searchUrl": "https://reverb.com/marketplace?query=Fender+Stratocaster",
  "condition": "all",
  "maxItems": 20
}
```

# Actor output Schema

## `dataset` (type: `string`):

The sold listings collected from Reverb in this run.

# 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 = {
    "target": "keyword",
    "query": "Fender Stratocaster",
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/reverb-sold-listings").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 = {
    "target": "keyword",
    "query": "Fender Stratocaster",
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/reverb-sold-listings").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "target": "keyword",
  "query": "Fender Stratocaster",
  "maxItems": 20
}' |
apify call maximedupre/reverb-sold-listings --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=maximedupre/reverb-sold-listings",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/absQBcOiS2wFfd0Xf/builds/7aq72NewngveYNfCj/openapi.json
