E-commerce
OfferUp Listings Scraper
Scrape OfferUp search results by keyword — price, condition, location, seller rating, and photos per listing — with ZIP-pinned location targeting, price/radius filters, and optional full listing-detail enrichment for local classifieds and resale-market research.
Free Apify credit covers a first run. No credit card to try.
What this Actor scrapes
OfferUp is the largest U.S. local-classifieds marketplace -- furniture, electronics, vehicles, and everything in between, sold peer-to-peer near you. This Actor runs your search queries against OfferUp's own search index and returns every matching listing as a clean, typed row: title, price, condition, seller, and location, with an optional deeper pass that pulls the full description, category, seller rating, and precise coordinates from each listing's detail page.
What we handle for you
- 🛡️ Browser fingerprint rotation --
curl-cffiimpersonates real Chrome / Firefox / Safari TLS handshakes so OfferUp sees a browser, not Python. - 🌐 US-pinned residential-ISP proxy pool -- fresh exit IP on every block, no drifting geography.
- 🔁 Retries with exponential backoff on
408 / 429 / 5xx-- up to 5 attempts per page,Retry-Afterhonoured. - 🧱 Rate-limit-aware pacing -- when OfferUp pushes back, we slow down instead of getting banned.
- 🧊 Clean, typed dataset rows -- Pydantic-validated, ISO-8601 timestamps, stable IDs, JSON / CSV / Excel export straight from the Apify Console.
- 💰 Pay-Per-Event pricing -- you only pay for results that hit your dataset. No data, no charge.
Use cases
- Resale arbitrage -- track newly posted listings across categories to spot underpriced items before anyone else.
- Local market research -- benchmark asking prices for a product category in a specific city or ZIP radius.
- Competitive intelligence for resellers -- monitor a competitor's listings and pricing moves over time.
- Lead generation for local services -- surface active sellers of a given item type as warm outreach targets.
Input
Paste this into the Apify Console, or send it as the run input over the API. Proxy settings are on by default; you rarely need to touch them.
| Field | Type | Required | What it does |
|---|---|---|---|
searchQueries | array | yes | 1-20 free-text OfferUp search terms, e.g. mountain bike or iphone 13. |
zipCode | string | no | US ZIP code to centre the search on. Leave empty to let OfferUp geolocate from the proxy's exit IP — convenient, but the exit rotates, so the same input returns a different city run to run. Set a ZIP for reproducible… |
radiusMiles | integer | no | OfferUp's own slider values -- must be one of 5, 10, 20, 30, or 50. |
priceMin | integer | no | Lower bound on listing price, in USD. |
priceMax | integer | no | Upper bound on listing price, in USD. |
sortBy | string | no | OfferUp's own confirmed sort-order values. |
maxItemsPerQuery | integer | no | Stops paging a query once this many listings are collected, or a page returns zero results. |
scrapeDetails | boolean | no | When enabled, fetches each listing's detail page for description, category, seller name/rating, and precise coordinates. Disable for a cheaper, search-tile-only pass. |
{
"searchQueries": [
"iphone 13"
],
"maxItemsPerQuery": 5,
"scrapeDetails": false,
"proxyConfiguration": {
"useApifyProxy": true
}
} Output
One row per result, schema-validated before it is written. Export JSON, CSV, Excel or XML from the run, or read it over the API.
listing_idtitlepricecondition_textlocation_nameseller_nameseller_ratingcategoryposted_at
{
"search_query": "mountain bike",
"listing_id": "4701d7d2-51cd-3f10-bc23-675fb1d1a32b",
"listing_url": "https://offerup.com/item/detail/4701d7d2-51cd-3f10-bc23-675fb1d1a32b",
"title": "Black Mountain Bike with Knobby Tires",
"price": 180.0,
"original_price": null,
"is_firm_price": false,
"currency": "USD",
"condition_text": null,
"location_name": "Greenfild Township, PA",
"latitude": 41.558,
"longitude": -75.494,
"image_url": "https://images.offerup.com/prtbnuI6j3f6BL0cpEm3gKbwrPs=/250x333/3a30/3a3088b58f6c48288524da0a7f735341.jpg",
"description": "Black full-frame mountain bike with knobby tires...",
"category": "Bikes & Cycling",
"seller_name": "Taylor",
"seller_rating": 5.0,
"seller_items_sold": 129,
"posted_at": "2026-08-15T04:19:33.246Z",
"scraped_at": "2026-08-15T12:00:00.000Z"
} Pricing
| Event | Price | When |
|---|---|---|
| Actor start | $0.20 | Once per run, covers warm-up and proxy session setup. |
| Result row | $0.0018 | Per result written to the dataset. |
You pay only for results that land. Cap any run with maxTotalChargeUsd. See pricing & billing for worked examples.
FAQ
Do I need a ZIP code?
zipCode and OfferUp centers results on your proxy's exit-IP location. Set zipCode for a precise, repeatable search location regardless of which IP the run happens to use.What's the difference with `scrapeDetails` on vs off?
Is this legal?
How do I export to Sheets?
Ready to run it?
Open the listing on Apify, paste the input above, and watch rows land. If it ever breaks, it is our problem before it is yours.
Related Actors