ThredUp resale listings as JSON, with the condition grade and the sold price kept
The ThredUp API turns thredup.com, the largest US online consignment and thrift marketplace, into clean JSON in three actions.
3 active endpoints, on 2 and 3 credit tiers.
- POST/thredup/v1/search
- POST/thredup/v1/item/detail
- POST/thredup/v1/brand/resolve
What ThredUp endpoints does ReefAPI ship?
3 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.
ThredUp API
3 of 3 endpoints, ready to run
Resale listings with item number and URL, brand, category, size, condition grade and wear note, garment measurements in inches, fibre composition, colours, and three prices — today's price, ThredUp's earlier list price and the estimated new retail — with the discount both as stated and as recomputed.
// Press "Try it" and this pane shows exactly what the // live site returned this second — including an empty // result, if that is the truth. No key, no account.
How the ThredUp API works
ThredUp is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.
No OAuth app, no request signing, no per-site account. One key covers all 438 engines.
Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.
Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.
One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.
From a keyword to a resale price picture
search is the entry point and every row carries the item_number the detail action needs. Because ThredUp caps its own result count, breadth comes from varying the department, brand and category rather than from reading a total.
Optional. Confirms the brand tag the filter takes and gives ThredUp's spelling — levis comes back as Levi's.
Up to 48 listed items with price, size, condition grade, measurements and the discount against retail. Check keyword_match_pct before trusting a keyword you have not used before.
The same slice of catalogue that has already sold, with the prices it sold at — the comparison most resale pricing work needs.
The full record: per-garment attributes, authenticity certificate where there is one, the sustainability estimate, and the seller block on seller-listed items.
One keyword search, one sold-state search and one detail call give you what a garment is listed at, what comparable garments actually sold for, the condition grade behind each price, and the measurements a buyer would check.
curl -X POST https://api.reefapi.com/thredup/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"nike dress","per_page":24}'{
"ok": true,
"data": { … },
"meta": {
"api": "thredup",
"endpoint": "search",
"mode": "live",
"latency_ms": …,
"record_count": …
},
"error": null
}Three prices on every listing, and why there is no field called price
ThredUp prints three different money figures for the same garment and they do not mean the same thing. This API never blends them and never ships a bare price key, because a single number would be ambiguous. Fill rates below are over 324 live listings sampled across eight department, category and keyword combinations.
| Field | What it is | How often it was filled |
|---|---|---|
| price_usd | What a buyer pays today. | 324 of 324 |
| thredup_list_price_usd | ThredUp's own earlier list price for the item. It is NOT a was-price: it was lower than price_usd on the first items measured (30.74 against 30.99, and 25.74 against 33.99). | 324 of 324 |
| retail_price_usd | ThredUp's estimated price for the item new at retail. This is the number the headline discount is taken against. | 324 of 324 |
| discount_vs_retail_pct | The discount against retail exactly as ThredUp states it. | 324 of 324 |
| discount_vs_retail_pct_computed | The same discount recomputed here from price_usd and retail_price_usd. | 324 of 324 |
| discount_disagrees_with_source | True when those two differ by more than a tenth of a point. Measured on 324 rows: 284 agreed, 40 disagreed. | Set on every row |
The disagreements are ThredUp's, not this API's, and they are flagged rather than smoothed. On one listing ThredUp stated 67.98 % off while its own 58.99 price against a 178 retail works out at 66.86 %, and on another it stated 75.02 % where the prices give 57.83 %. Both numbers ship so you can pick which one your product needs, and the flag tells you when you have to choose.
What ThredUp publishes, and where it stops
Measured on 2026-10-01 over two consecutive runs of the same fixed case list. The limits below are the source's, not the API's.
United States, womenswear plus boys and girls. 13 departments returned listings; men and kids returned zero in the same run and are refused with the reason
Exactly what you ask for — measured one-for-one at 12, 24, 36, 48, 60, 96, 119, 120 and 200. Capped at 120
ThredUp caps its own at 10001 for every query, so it is returned flagged as a cap and never as a result total
Four pages of 48 on one keyword gave 178 distinct item numbers, not 192 — the ranked index shifts between calls
item number, URL, title, brand, category, all three prices, condition grade, size, measurements, photo numbers and favourite count: 324 of 324. Colours 322 of 324. Fibre composition 282 of 324
199 of 324 — ThredUp's graders write one only where there is wear to describe
EU size (0 of 324), free-text description (0 of 324), manufacturer part number (0 of 324), image URLs, and any quantity field
Returned on item/detail only. It was null on 12 of 12 search rows where the item was seller-listed, and present on 3 of 3 of the same items' detail records
Selectable. A purchased-only search returned 24 of 24 rows in that state
324 listings: ThredUp's stated discount matched the one recomputed from its own prices on 284, disagreed on 40 — flagged per row, never smoothed
6 of 6 item numbers taken from search resolved in detail to the same record, in both runs
Two consecutive runs of 19 cases: 13 successful calls and 6 intended negatives landing on the right error codes, both times. Median response 2.3 s
What people build with ThredUp
The jobs this data is most often used for.
endpoints
credits per call
Resale price research: pull the same brand and category with listing_state set to purchased to see what actually sold, then compare against the listed rows to measure how far asking prices sit above clearing prices.
Brand and category monitoring: track how much of ThredUp's catalogue a brand holds, at what condition grades, and at what discount against new retail, using the condition grade and the two discount figures on every row.
Sizing and fit tools: every listing carries the displayed size, the raw size value and scale, and the garment measurements in inches that ThredUp's warehouse recorded, with the measurement method stated as automated or physical.
Sustainable-fashion and circular-economy dashboards: item/detail returns ThredUp's own per-item impact estimate (water, lighting hours, car miles), alongside the fibre composition that drives it.
What ThredUp data costs
The cheapest call here is 2 credits, so $15/mo (Pro) buys 5,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.
Full pricing →- 1,000 free credits on signup, no card
- One key, all 438 APIs, one credit pool
- Failed and blocked calls are never charged
- Credits roll over and never expire
Call it in two lines
Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.
curl -X POST https://api.reefapi.com/thredup/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"nike dress","per_page":24}'import requests
r = requests.post(
"https://api.reefapi.com/thredup/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"query": "nike dress",
"per_page": 24
},
)
print(r.json()["data"])Have a question? We got answers.
The questions people actually ask before wiring up ThredUp.
Get a free key →Does a listing come with a stock or quantity number?▾
No, and that is deliberate. ThredUp is single-copy resale: each listing is one physical garment with no size or colour variants and no restock, and ThredUp publishes no quantity field for it anywhere on this surface — all 62 fields of its item record were enumerated and there is no stock, quantity or qty among them. Inventing one, or shipping a constant that looks like stock, would be worse than publishing nothing. What you get instead is availability as ThredUp states it, listing_state (listed, purchased or packed) and a derived is_available, which is true only while the state is listed.
Can I get listings that have already sold?▾
Yes, on purpose. Set listing_state to purchased or packed and the search returns items that are already bought, with their price. In resale the sold price is usually the number people are after, so this API treats a sold listing as data rather than as a dead record: a listing that sold between your search and your detail call comes back with listing_state purchased and a full record, not an error. Measured: a purchased-only search returned 24 of 24 rows in that state.
Why does total_count always say 10001?▾
Because that is ThredUp's own ceiling, not a count. Thirteen different filters, all returning visibly different listings, every one reported exactly 10001. So this API returns the number ThredUp gave together with total_count_is_capped set to true, and never presents it as a result total. The useful count is the count field, which is the number of rows in the page you asked for.
How many rows per page, and can I page through a whole category?▾
You choose the page size and ThredUp honours it exactly: measured one-for-one at 12, 24, 36, 48, 60, 96, 119, 120 and 200 rows, and capped here at 120. Paging works, but ThredUp's ranked index shifts between calls, so pages overlap: four pages of 48 on one keyword returned 178 distinct item numbers rather than 192, with page 2 repeating one row and page 4 repeating thirteen. The API reports duplicate_in_page for repeats inside the page you asked for, and de-duplicating across pages on your side is still worth doing.
What happens if my keyword matches nothing?▾
ThredUp does not return an empty result for an unmatchable keyword — it fills the page with unrelated stock and still reports its usual count. So this API measures how many of the returned listings actually carry your keyword in their title, brand, category or tags, and publishes that as keyword_match_pct with a looks_like_padding flag. Measured across two runs: nike dress 87.5 to 91.7 %, levis 501 95.8 %, coach bag 100 %, and two deliberately nonsense keywords 0.0 % each, flagged in both runs. Without that flag an unmatchable search looks like a successful one.
Are there image URLs?▾
No. ThredUp's listing record carries photo numbers and the kind of each photo (the regular shots, the annotated condition close-ups, the 360-degree frames) and this API returns all of them, but the image host would not serve any of the six address shapes tested, so no image URL is published. Guessing one would hand you links that break. If images matter for your use case, say so and we will add them once the address is confirmed.
Which departments work, and is there menswear?▾
Thirteen departments returned listings in the run measured: women, juniors, plus, petite, tall, maternity, designer, handbags, shoes, accessories, jewelry, boys and girls. Menswear and a generic kids department both returned zero listings in that same run, so neither is accepted — asking for them gives a clear parameter error with the reason instead of an empty success. ThredUp's live catalogue on this surface is womenswear plus boys and girls.
Do the filters actually narrow the results?▾
Each one was checked on its returned rows, not on the result count, because ThredUp's count is capped. Brand Nike gave 48 of 48 rows branded Nike. Category dresses gave 48 of 48. Condition excellent gave 24 of 24 at that grade. Colour Black gave 24 of 24 where the unfiltered page carried eight colours. Clearance-only gave 24 of 24 clearance rows where the unfiltered page had none. Designer-only returned Bottega Veneta, Burberry, Bvlgari and Céline where the unfiltered page carried nineteen mixed brands. The price band is ThredUp's own and carries slack: asking 0 to 15 returned prices of 8.99 to 19.99, 50 to 60 returned 40.99 to 60.99, and 100 to 200 returned 107.99 to 197.99 — the band applies to ThredUp's pre-promotion figure, which is why it is documented on the parameter rather than hidden. Two filters ThredUp accepts but does not honour were tested and deliberately left out of this API rather than shipped as handles that do nothing.
What is the ThredUp API?▾
ThredUp API is a ReefAPI endpoint group for us fashion resale: secondhand clothing, shoes and bags with brand, size, condition grade, garment measurements and the price today beside the estimated new-retail price. It returns live JSON through POST requests under /thredup/v1.
Is the ThredUp API free to try?▾
Yes. ReefAPI starts with 1,000 free credits, no card required. ThredUp calls use the same shared credit balance as every other ReefAPI engine.
Do I need a ThredUp login or account?▾
No login to ThredUp 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 ThredUp 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 ThredUp API use?▾
ThredUp actions currently cost 2-3 credits per successful call. Failed or blocked calls are free. All APIs draw from one credit pool.
Can I call ThredUp from an AI assistant or MCP client?▾
Yes. Connect ReefAPI once through MCP and your assistant can call thredup actions with the same key, credit pool and JSON envelope used by normal REST requests.
191 E-commerce & Marketplaces APIs on the same key
One key, one credit pool, one response envelope. If you are pulling ThredUp, you are one call away from the rest of the category — no second contract, no second integration.
Need something this API does not do?
Name the endpoint, the field, or a source we do not carry yet. We ship new APIs every week and you would be first to get the key. Real people read every message and reply the same day.
Try it on your own data before you pay anything
The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 437 APIs, and the same envelope everywhere.
Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts. Field notes were captured on 2026-10-01.