ShopGoodwill Sold Prices & New Listing Alerts
Pricing
from $1.50 / 1,000 item row returneds
ShopGoodwill Sold Prices & New Listing Alerts
ShopGoodwill sold prices: closed auctions with their final price, bids and end time for any search, plus an optional median / quartile comps summary and new-listing alerts to Discord, Slack or Telegram. No login. Searches that find nothing are free.
Pricing
from $1.50 / 1,000 item row returneds
Rating
0.0
(0)
Developer
Adriana Voss
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Share
Search ShopGoodwill and get what the items really sold for. For each search you get one row per item (title, category, final price, bids, end time, a link) from the site's closed auctions, an optional comps summary (median, quartiles, low, high), and, if you schedule it, alerts to Discord, Slack or Telegram when a new listing appears. It uses ShopGoodwill's public search data, so there is no login and no API key. A search that finds nothing is free.
Typical uses: price a lot before you bid on it, check what a brand or model sells for, or watch a search for new listings under a price.
How to use
- In the Apify Console. Open the actor page and click Start — the
searchesfield is already pre-filled with a working example. Results land in the run's dataset as soon as each item is found. - Via the API. Call it directly with a POST request — no Console needed once you have an API token:
curl "https://api.apify.com/v2/acts/accountable_eel~shopgoodwill-sold-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \-X POST \-H "Content-Type: application/json" \-d '{"searches":["pyrex"]}'
- On a schedule. Save this actor as an Apify Task with the input you want, then add a Schedule (hourly, daily, weekly) so it runs on its own — no server of your own required.
Input
{"searches": ["pyrex"]}
One search per line, the words you would type into ShopGoodwill's search box, such as "pyrex" or "vintage camera". Each search reads up to the number of items set below, 40 per page. Accepted formats: pyrex, vintage camera, le creuset.
Example
Price pyrex from the last 30 days, add a summary row, and get a Discord message for every new live listing under $25 on later runs:
{"searches": ["pyrex"],"mode": "sold","maxItems": 40,"includeCompsSummary": true}
Sold prices come back as item rows (saleStatus: "sold") plus one comps-summary row with count, soldWithBidsCount, medianUsd, p25Usd, p75Usd, lowUsd, highUsd, medianBids and newestEndTime.
For the alert, save this as a Task and schedule it daily:
{"searches": ["pyrex"],"mode": "live","maxPrice": 25,"maxItems": 100,"deltaMode": true,"deltaName": "pyrex-under-25","skipFirstRun": true,"alertOnChangeOnly": true,"notifyUrl": "https://discord.com/api/webhooks/<id>/<token>"}
The first run remembers what is listed now (skipFirstRun, nothing returned or billed). Each later run returns, bills and posts only the listings it has not seen before.
Output
Rows are item rows, plus one comps-summary row per search when you ask for it. For example:
| query | found | status | rowType | searchMode | itemId | url | title | category | categoryId | priceUsd | bids | saleStatus | endTime | startTime | sellerId | shippingUsd | totalMatching | keywordMatch | changeType | alertReason | previousPriceUsd | priceChangePct | checkedAt | count | soldWithBidsCount | medianUsd | p25Usd | p75Usd | lowUsd | highUsd | medianBids | newestEndTime | windowDays | scrapedAt |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| pyrex | true | OK | <searched: sold (closed auctions) or live> | <category path> | <final price (sold) or current bid (live), usd> | <sold, no-bids or live> | <auction end time (shopgoodwill site time)> | <auction start time (shopgoodwill site time)> | <seller (goodwill store) id> | <shipping price shown in the listing, usd> | <since last run: new or seen (monitoring only)> | <alert reason: new-listing or price-below (monitoring only)> | <price the last run saw, usd (monitoring only)> | <price change since the last run, % (monitoring only)> | <checked at (iso time)> | <summary: items read> | <summary: items with at least one bid> | <summary: median price, usd> | <summary: 25th percentile price, usd> | <summary: 75th percentile price, usd> | <summary: lowest price, usd> | <summary: highest price, usd> | <summary: median number of bids> | <summary: newest end time read> | <summary: days of closed auctions searched> | 1970-01-01T00:00:00.000Z |
A miss comes back as a row with "found": false and is never charged.
Fields
| Field | Meaning |
|---|---|
itemId, url | ShopGoodwill's item number and the item page link. |
title, category, categoryId | The listing title and its category path. |
priceUsd | Sold mode: the final price. Live mode: the current bid. |
bids | Number of bids. |
saleStatus | sold (closed with at least one bid), no-bids (closed with none, only if you ask for them) or live. |
endTime, startTime | ShopGoodwill's own clock, with no time zone attached. |
sellerId | The seller's number. ShopGoodwill does not return the shop name in search results. |
shippingUsd | The shipping price the listing shows (often 0 or a token amount; check the item page). |
totalMatching | How many items ShopGoodwill matched for the search, which can be far more than you asked for. |
changeType, alertReason, previousPriceUsd, priceChangePct | Monitoring only (empty otherwise). |
keywordMatch | Which of your "only keep titles containing" words matched. |
Limits
- Sold mode reads closed auctions as ShopGoodwill's search returns them: newest end time first, 40 per page, 10 pages (400 items) per search, and at most 365 days back (30 days when you do not set a date).
- An auction that closed with no bids is not a sale, so it is left out unless you tick the box. The summary prices use only auctions that had a bid.
- A closed auction's price is the last bid. It does not include shipping, ShopGoodwill's buyer's premium or tax.
- Live mode lists the items that end last first, which is roughly newest first. A broad search can have more live items than you ask for, so new-listing alerts only see what was read; keep alert searches narrow or raise the item limit.
- The price filters and the category filter are applied by ShopGoodwill. The date, title and no-bid filters are applied after the fetch.
- Requests are spaced two seconds apart, so a 400-item search takes under a minute. The actor does not log in and never opens cart, account or checkout pages.
- Monitoring remembers up to 20,000 items per watchlist in a named store on your account; the oldest are forgotten first.
Pricing
Pay-per-event. A flat per-run fee covers session/proxy warmup; you're billed
per item only when data is actually found and returned — see
.actor/pay_per_event.json for exact prices. A miss is never charged.
Use it from Clay, n8n, Make, or an AI agent
This actor runs synchronously over plain HTTP — call it directly from a script, a workflow tool, or an AI agent, no Apify Console needed once you have an API token.
curl "https://api.apify.com/v2/acts/accountable_eel~shopgoodwill-sold-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \-X POST \-H "Content-Type: application/json" \-d '{"searches":["pyrex"]}'
n8n. Add an HTTP Request node: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~shopgoodwill-sold-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body Content Type JSON, JSON Body {"searches":["pyrex"]} (swap in an expression from an earlier node for a real value).
Clay. Add an "HTTP API" column: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~shopgoodwill-sold-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body {"searches":["{{search}}"]}, mapping the row's search into the searches array.
MCP. In Claude, Cursor, or any MCP client with the Apify MCP server, ask for "ShopGoodwill Sold Prices & New Listing Alerts | Apify" — the agent will find and run this actor.