OfferUp Scraper
Pricing
from $1.40 / 1,000 listings
OfferUp Scraper
Scrape OfferUp listings by keyword, ZIP, and price filters. Each row has the asking price, condition, city, and photo from the public search. Monitor mode saves only new listings and price changes.
Pricing
from $1.40 / 1,000 listings
Rating
0.0
(0)
Developer
Andrej Kiva
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Disclaimer: Unofficial tool — not affiliated with, sponsored by, or endorsed by OfferUp Inc. or its affiliates. Data is read from publicly accessible search results only. No login. You are responsible for complying with applicable law (including GDPR where personal data appears) and the site’s terms. No warranty on accuracy or availability. Provided for informational and research use.
OfferUp scraper for US local listings. Each row is one search card: asking price in USD, condition, city, and photo. Search by keyword and ZIP, or paste a results URL. Use it as an OfferUp API alternative from Python, Node.js, cURL, or Apify MCP.
Best for: phone and furniture comps in one ZIP, price-filtered leads, and a scheduled run that saves only new listings and price changes.
| Actor | Role |
|---|---|
| OfferUp Scraper ◄── you are here | US classifieds: price, condition, city, new-listing monitor |
| Facebook Marketplace Scraper | US marketplace listings |
| eBay Sold Listings Scraper | Sold comps for the same goods |
| Leboncoin Scraper | France classifieds |
| Vinted Monitor | Fashion resale alerts |
| Depop Monitor | Depop new listings |
| Poshmark Sold Listings Scraper | Poshmark sold comps |
When to use this Actor
- A keyword in a ZIP — Set Keyword to iphone and ZIP to 10001. Leave Search URLs empty.
- A price band — Set a minimum or maximum. Add a condition such as Used when you want that filter.
- A results page you already opened — Paste the search URL. Keyword and ZIP are ignored when Search URLs is set.
- New ads and price cuts — Turn on monitor mode and schedule the same search. The first run stores a baseline and saves nothing. Later runs save new listing ids and price changes.
When not to use this Actor
- A single listing page — Item pages are not requested. The row is the search card.
- Seller phone numbers or a full seller profile — Those are not on the search card.
- A national dump in one run — Cap
maxItems(150). Split by ZIP.
Key features
- Search cards — Title, USD price, condition, city, photo, delivery flags, and vehicle miles when the card includes them. Default 256 MB. No browser.
- Keyword, ZIP, radius, price, and condition — Recent, closest, or price sort.
- Pasted search URL — a results link. Listing URLs are skipped.
- Promoted tiles — A seller promotion is still one listing.
promotedis true on that row. Display ads are dropped. - Monitor — Named key-value store of listing id and last price for that search. The seed run saves nothing.
Input
| Field | Required | Default | What it does |
|---|---|---|---|
| Search URLs | No | — | Wins over the filters below. |
| Keyword | No | iphone when the form is empty | Search text when URLs are empty. |
| ZIP code | No | 10001 | US ZIP the search is centered on. |
| Radius | No | 30 miles | Distance from the ZIP. 50 miles is the widest step. |
| Minimum / maximum price | No | — | Asking-price band in USD. |
| Condition | No | any | New, open box, reconditioned, used, for parts, other. |
| Sort | No | Recent first | Applied when the Actor builds the search. |
| Maximum listings | No | 30 | Cards to examine, up to 150. |
| Monitor mode | No | off | Baseline first, then new ids and price changes. |
| Monitor state store | No | offerup-monitor | Named store for the baseline. |
| Proxy | No | off | Turn on US residential only if a run is blocked. |
{"keyword": "iphone","zipCode": "10001","radius": "30","sort": "-posted","maxItems": 30,"monitorMode": false,"proxyConfiguration": {"useApifyProxy": false}}
Output
| Field | Meaning |
|---|---|
id | Listing id |
url | Public listing path built from the id |
title | Listing title |
price | Asking price in USD |
condition | Condition text from the card |
location | City and state |
image | Photo URL |
isFirmPrice | True when the card marks the price as firm |
vehicleMiles | Odometer when the card includes it |
flags | Delivery flags such as LOCAL_PICKUP |
promoted | True on a promoted seller tile |
changeType | new or price_change on monitor runs |
previousPrice | Prior asking price when changeType is price_change |
scrapedAt | UTC timestamp |
{"id": "11111111-1111-1111-1111-111111111111","url": "https://offerup.com/item/detail/11111111-1111-1111-1111-111111111111","title": "iPhone 13 128GB","price": 400,"currency": "USD","condition": "Used","location": "Yonkers, NY","image": "https://images.offerup.com/example.jpg","isFirmPrice": false,"flags": ["LOCAL_PICKUP"],"scrapedAt": "2026-09-29T12:00:00Z"}
Use cases
- Compare asking prices for one phone model inside a ZIP and keep condition and pickup flags.
- Pull sofas under a price cap and export city plus photo for a lead list.
- Schedule monitor mode each morning and export only listings whose price moved.
- For sold comps on the same goods, run eBay Sold Listings Scraper. For other US marketplace posts, run Facebook Marketplace Scraper.
Integration examples
Replace APIFY_TOKEN. The slug below is the Store name.
Node.js
import { ApifyClient } from "apify-client";const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor("crawloop/offerup-scraper").call({keyword: "iphone",zipCode: "10001",maxItems: 30,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Python
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("crawloop/offerup-scraper").call(run_input={"keyword": "sofa","zipCode": "90210","maxPrice": 200,"maxItems": 30,})items = client.dataset(run["defaultDatasetId"]).list_items().itemsprint(len(items))
cURL
curl -X POST "https://api.apify.com/v2/acts/crawloop~offerup-scraper/runs?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"keyword":"iphone","zipCode":"10001","maxItems":30}'
MCP and AI assistants
Use this Actor from AI tools via Apify MCP.
Connect your Apify account, then call this Actor by its Store name crawloop/offerup-scraper.
Example prompts:
- "Run OfferUp Scraper for iphone in ZIP 10001 and return price, condition, and location as JSON"
- "Scrape OfferUp sofas in 90210 under 200 dollars and list title, price, and city"
- "Run OfferUp Scraper in monitor mode for honda civic in 10001, then use eBay Sold Listings Scraper for sold comps"
Suite next step
This Actor covers US local classifieds. For sold prices on the same goods, run eBay Sold Listings Scraper. For other US marketplace posts, run Facebook Marketplace Scraper.
FAQ
Does this open every listing page? No. Each row is the public search card. Description and seller profile are not requested.
Which country is included? United States searches by ZIP. Other countries are not requested.
What if the run is blocked? Retry once with the proxy off. If the run still fails, turn on a US residential proxy.
What does monitor mode skip? Listing ids already stored for that same search, unless the asking price changed. A quiet tick writes zero rows. The first run only fills the baseline.
Are phone numbers included? No. The row has the public price, city, condition, and photo from the search card.