OfferUp Listings Scraper icon

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-cffi impersonates 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-After honoured.
  • 🧱 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.

FieldTypeRequiredWhat 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

EventPriceWhen
Actor start$0.20Once per run, covers warm-up and proxy session setup.
Result row$0.0018Per 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?
No -- omit 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?
Off returns the fast search-tile fields (title, price, condition, location, image) at one request per query. On adds one extra request per listing for description, category, seller name/rating, and precise coordinates.
Is this legal?
We only fetch content OfferUp already makes publicly available on its search and listing pages. Respect OfferUp's own terms of service before using the output commercially.
How do I export to Sheets?
After the run, click Storage -> Dataset -> Export and pick CSV. Google Sheets imports it directly.

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

Teams that run this also run