ShopGoodwill API & Scraper
ShopGoodwill is Goodwill's own auction marketplace: 163 regional Goodwill organisations list second-hand lots, most of them as bid auctions.
🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.
This API returns a listing row with the facts an auction actually turns on — current high bid, bid count, minimum next bid and the resolved end time — plus full detail, the public bid log, the 268-node category tree, the seller directory and closed-auction sold prices going back up to 30 days. Timestamps are the part most integrations get wrong: the source publishes them with no timezone at all, so every row carries both ends_at_local (the untouched source string) and ends_at (ISO-8601 with the US Pacific offset, daylight saving applied).
What one listing row carries
Measured on 373 rows across ten keyword and category searches.
| Field | Fill | What it is |
|---|---|---|
| current_price + price_basis | 373/373 | On an auction this is the live high bid, not an asking price. price_basis says which, so you never have to guess. |
| bid_count | 373/373 | Bids placed so far. Matched the detail endpoint's bid log exactly on 16 of 16 round trips. |
| minimum_next_bid | 373/373 | The smallest bid the source will currently accept. |
| ends_at / ends_at_local | 373/373 | Resolved ISO-8601 with offset, and the raw source string beside it. |
| seconds_remaining | 373/373 | Derived from the resolved end time, so it is exact to the second — the source's own countdown rounds to its coarsest unit. |
| buy_now_price | 100/373 | Only the two buy-now formats carry one; the source's 0.0 is returned as null, never as a price of zero. |
| seller_id + category_id | 373/373 | Feed either straight back into search as a filter. |
| part_number | 13/373 | Published only when the Goodwill that listed the lot typed one in. |
The source serves a fixed 40 rows per page and ignores any page-size request, so no page_size parameter is offered. There is no condition or grade field anywhere upstream — condition is described in free text only.
Real request and response JSON
Captured from the indexed primary action, search, on .
{
"method": "POST",
"url": "https://api.reefapi.com/shopgoodwill/v1/search",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"query": "vintage camera",
"sort": "most_bids",
"page": 1
}
}{
"ok": true,
"meta": {
"api": "shopgoodwill",
"endpoint": "search",
"mode": "live",
"latency_ms": 825.6,
"record_count": 40,
"bytes": 137359,
"cache_hit": false,
"upstream_requests": 1,
"time_zone": "America/Los_Angeles",
"charged_credits": 1,
"version": "1.0.0",
"request_id": "1d4e60d09e3e435a",
"queue_ms": 1.2,
"fetched_at": "2026-10-06T14:47:19.477Z"
},
"data": {
"total": 2040,
"page": 1,
"page_size": 40,
"last_page": 51,
"has_more": true,
"page_beyond_last": false,
"listings": [
{
"item_id": "278978809",
"title": "*AUTHENTIC* Vintage Gucci GG Monogram Canvas Crossbody Camera Bag w/COA",
"url": "https://shopgoodwill.com/item/278978809",
"listing_type": "auction",
"listing_type_code": 0,
"is_auction": true,
"current_price": 426,
"price_basis": "current_high_bid",
"currency": "USD",
"bid_count": 26,
"starting_price": 16.75,
"minimum_next_bid": 16.75,
"buy_now_price": null,
"shipping_price": 0,
"ends_at": "2026-10-07T20:13:00-07:00",
"ends_at_local": "2026-10-07T20:13:00",
"ends_at_is_placeholder": false,
"starts_at": "2026-09-30T12:08:53-07:00",
"starts_at_local": "2026-09-30T12:08:53",
"seconds_remaining": 131141,
"ended": false,
"source_remaining_time": "1d 12h",
"seller_id": 137,
"category_id": 103,
"category_name": "Purses",
"category_full_name": "Clothing > Women's Clothing > Purses",
"quantity": 1,
"is_stock_item": false,
"part_number": null,
"image_url": "https://shopgoodwillimages.azureedge.net/production/137\\Items\\2026-09-30\\0d114c05-62ba-4f5a-9826-6f4f75dba9e5nt21_0930t1.jpeg"
},
{
"item_id": "278833445",
"title": "Vintage Nikon FE2 35mm SLR Film Camera",
"url": "https://shopgoodwill.com/item/278833445",
"listing_type": "auction",
"listing_type_code": 0,
"is_auction": true,
"current_price": 201,
"price_basis": "current_high_bid",
"currency": "USD",
"bid_count": 15,
"starting_price": 9.99,
"minimum_next_bid": 9.99,
"buy_now_price": null,
"shipping_price": 0,
"ends_at": "2026-10-06T18:04:00-07:00",
"ends_at_local": "2026-10-06T18:04:00",
"ends_at_is_placeholder": false,
"starts_at": "2026-09-29T08:25:59-07:00",
"starts_at_local": "2026-09-29T08:25:59",
"seconds_remaining": 37001,
"ended": false,
"source_remaining_time": "10h 16m",
"seller_id": 135,
"category_id": 172,
"category_name": "Film Cameras",
"category_full_name": "Cameras & Camcorders > Film Cameras",
"quantity": 1,
"is_stock_item": false,
"part_number": null,
"image_url": "https://shopgoodwillimages.azureedge.net/production/135\\Items\\2026-09-29\\71ac90b7-f68b-4a65-a77e-e8ba907798daward_0929t1.jpeg"
},
{
"item_id": "278868112",
"title": "Vintage Minolta XD-S SLR 35mm Film Camera w/ 50mm Lens",
"url": "https://shopgoodwill.com/item/278868112",
"listing_type": "auction",
"listing_type_code": 0,
"is_auction": true,
"current_price": 127.9,
"price_basis": "current_high_bid",
"currency": "USD",
"bid_count": 13,
"starting_price": 10,
"minimum_next_bid": 10,
"buy_now_price": null,
"shipping_price": 0,
"ends_at": "2026-10-06T20:23:00-07:00",
"ends_at_local": "2026-10-06T20:23:00",
"ends_at_is_placeholder": false,
"starts_at": "2026-09-29T13:33:43-07:00",
"starts_at_local": "2026-09-29T13:33:43",
"seconds_remaining": 45341,
"ended": false,
"source_remaining_time": "12h 35m",
"seller_id": 155,
"category_id": 175,
"category_name": "Vintage Cameras",
"category_full_name": "Cameras & Camcorders > Vintage Cameras",
"quantity": 1,
"is_stock_item": false,
"part_number": null,
"image_url": "https://shopgoodwillimages.azureedge.net/production/155\\Items\\2026-09-29\\e7696b39-98d8-481d-a15c-939dbda96aaawine_0929t1.jpeg"
}
],
"query": "vintage camera"
}
}What the ShopGoodwill API does
| Action | Description | Concrete use case | Key params |
|---|---|---|---|
| search | Search LIVE ShopGoodwill listings — the US Goodwill charity auction marketplace, 650k+ open lots across 163 regional Goodwill sellers. Every row carries the auction facts that matter more than the price: current high bid, bid count, resolved end time and minimum next bid. Give query, or category_id, or seller_id (at least one of the three). The source serves a fixed 40 rows per page. | Pricing teams call search to search LIVE ShopGoodwill listings. | query, category_id, seller_id, listing_type, min_price, ... |
| sold | Closed ShopGoodwill auctions — the same rows after the hammer, where current_price is the FINAL price the lot sold for and bid_count is the bidding that got it there. A sold-price comparable set for second-hand pricing. Covers a window of up to 30 days back from ending_before. | Marketplace operators call sold to get closed ShopGoodwill auctions. | query, category_id, seller_id, days_back, ending_before, ... |
| detail | Full public detail for one lot by the item_id search returns: description, every gallery image, the auction clock, the reserve state, the bid increment, shipping and handling, the pickup address of the Goodwill that listed it, and the complete public bid log. | Catalog enrichment teams call detail to get full public detail for one lot by the item_id search returns. | item_id |
| bids | The public bid log for one lot on its own: every bid placed with the source-masked bidder handle, the amount, the resulting price and the timestamp, plus the reserve state and whether the auction has closed. Works on live auctions as well as closed ones. | Retail analysts call bids to get the public bid log for one lot on its own. | item_id |
| categories | The ShopGoodwill category taxonomy as the site's own search publishes it: two levels, 29 top-level departments and 239 subcategories, each with the numeric category_id the search action takes. | Pricing teams call categories to get the ShopGoodwill category taxonomy as the site's own search publishes it. | top_level_only |
| sellers | The directory of regional Goodwill organisations selling on the site (163 measured), with the numeric seller_id the search action takes and the US state and city each one ships and allows pickup from. | Marketplace operators call sellers to get the directory of regional Goodwill organisations selling on the site (163 measured), with the…. | state, query |
| seller | The public profile of one regional Goodwill seller: organisation name, mailing address, mission statement, return policy and customer service note. | Catalog enrichment teams call seller to get the public profile of one regional Goodwill seller. | seller_id |
| seller_items | The listings one regional Goodwill seller currently has open, as the site's own seller storefront shows them. | Retail analysts call seller_items to get the listings one regional Goodwill seller currently has open, as the site's own seller storef…. | seller_id |
Call search from your stack
curl -X POST https://api.reefapi.com/shopgoodwill/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"vintage camera","sort":"most_bids","page":1}'import requests
r = requests.post(
"https://api.reefapi.com/shopgoodwill/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"query": "vintage camera",
"sort": "most_bids",
"page": 1
},
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/shopgoodwill/v1/search", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"query": "vintage camera",
"sort": "most_bids",
"page": 1
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.shopgoodwill.search with {"query":"vintage camera","sort":"most_bids","page":1}.Who uses this API and why
- Snipe and bid-timing tools that need the end time right to the second, in a real timezone.
- Resale and arbitrage research: pull 30 days of closed-auction hammer prices for a keyword or category.
- Collectible price tracking across coins, cameras, Pyrex, jewellery, Lego and vinyl with the bid count as a demand signal.
- Bid-competition analysis from the public bid log: how many distinct bidders, how fast the price climbed.
- Regional sourcing: filter 163 Goodwill sellers by state to find lots you can collect in person.
Questions developers ask before integrating
What timezone are the auction end times in?
US Pacific (America/Los_Angeles). The source publishes a naive string with no offset and no Z, which is how integrations end up an hour out. ends_at is ISO-8601 with the offset applied by the US daylight-saving rule (October rows resolve -07:00, December rows -08:00), and ends_at_local is the untouched source value so you can always check our arithmetic. The resolved clock was checked against the source's own server time on every detail call and agreed to 0.5 seconds.
Can I get sold prices, not just live asks?
Yes. The sold action returns closed auctions over a window of 1 to 30 days back, where current_price is the final hammer price and bid_count is the bidding that got it there. On three closed lots we checked the sold-row price, the detail price and the highest row in the bid log and all three agreed: 566.00, 311.00 and 1702.00.
Is the bid log really public?
Yes, for live and closed auctions alike. You get every bid with its amount, the resulting price, the timestamp and a retracted flag, plus one standing-bid row per bidder. Bidder handles arrive masked by ShopGoodwill itself (for example m****n) and we never unmask them.
How deep can I page?
As deep as the result goes. For a 21,062-result search the last page carrying rows was 527 (40 rows per page, the final page holding 22). The response tells you last_page, has_more and page_beyond_last, so overrunning the end is reported as an overrun and never as zero results.
Which filters actually work?
Ten, and each was verified against two independent control searches rather than trusted: sale format, min and max price, local-pickup-only, exclude-pickup-only, one-cent-shipping, ships-to-Canada, international-shipping-only, description search, plus category and seller. Example on 21,065 nike lots: buy-now 10,571, auctions 15,362, pickup-only 5, one-cent shipping 2,241. Six sorts are offered and all six were proven to reorder; four more sort codes the site accepts do nothing, so they are not published.
How many sellers and categories are there?
163 regional Goodwill organisations, each with its numeric seller_id, US state and city — Ohio 17, California 13, Texas 12, Pennsylvania 11. The category tree is two levels: 29 departments and 239 subcategories, 268 nodes in all. There is no third level upstream.
What needs a ShopGoodwill account and is therefore not here?
Watchlist, saved searches, your own bids and orders, pickup scheduling, and a shipping quote to a specific address — all of those require a signed-in buyer. Everything this API returns is what a visitor can see without logging in.
Is every lot an auction?
No, and the row tells you which: auction (bid only), buy_now (fixed price) or auction_with_buy_now (bidding plus a buy-now price). Of 373 rows measured, 100 carried a real buy-now price.
What is the ShopGoodwill API?
ShopGoodwill API is a ReefAPI endpoint group for goodwill's charity auctions with the bid count and the real end time, not just a price. It returns live JSON through POST requests under /shopgoodwill/v1.
Is the ShopGoodwill API free to try?
Yes. ReefAPI starts with 1,000 free credits, no card required. ShopGoodwill calls use the same shared credit balance as every other ReefAPI engine.
Do I need a ShopGoodwill login or account?
No login to ShopGoodwill is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the ShopGoodwill data?
The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the ShopGoodwill API use?
ShopGoodwill actions currently cost 1-2 credits per successful call. Failed or blocked calls are free. All APIs draw from one credit pool.
Can I call ShopGoodwill from an AI assistant or MCP client?
Yes. Connect ReefAPI once through MCP and your assistant can call shopgoodwill actions with the same key, credit pool and JSON envelope used by normal REST requests.