OfferUp Scraper
Pricing
from $0.99 / 1,000 listings
OfferUp Scraper
Scrape OfferUp listings by keyword, category, or ZIP code, or look up specific listing IDs/URLs directly, with optional full detail, seller, and photo data.
Pricing
from $0.99 / 1,000 listings
Rating
0.0
(0)
Developer
ParseBird
Maintained by CommunityActor stats
1
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
OfferUp Scraper
Scrape OfferUp listings by keyword, category, and ZIP code, or look up specific listing IDs and URLs directly — no login or app required.
| Search any U.S. ZIP code by keyword or category, filter by price and condition, and optionally pull full listing detail — seller profile, photos, category, and fulfillment options — for every result. |
Copy to your AI assistant
Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this OfferUp scraper: parsebird/offerup-scraper on Apify. Call it with the ApifyClient (Python: ApifyClient(token).actor("parsebird/offerup-scraper").call(run_input={"query": "playstation", "zipCode": "94102", "maxItems": 50, "fetchDetails": True})) or the equivalent JS client. Key inputs: query (keyword, default "iphone"), zipCode (U.S. ZIP, default "10001"), category (id like "1.5", parent.child format), minPrice/maxPrice, conditions (new, openBox, reconditioned, used, forParts, other), sortBy (bestMatch, recent, closest, lowPrice, highPrice), fetchDetails (default false, adds a _details object per item), maxAge (hours, with sortBy=recent + fetchDetails), maxItems (default 10, 0 = unlimited), and listingIds (listing IDs or item URLs — when set, search is skipped and these are looked up directly with full details). Output is one JSON object per listing: listingId, title, price, formattedPrice, locationName, image, flags, url, plus _details and _detailsStatus (success/not-found/error) when details were requested. Full API reference: https://apify.com/parsebird/offerup-scraper/api. Get an API token at https://console.apify.com/account/integrations.
What does OfferUp Scraper do?
This OfferUp scraper extracts structured listing data from offerup.com without an official API. It supports two input modes:
- 🔍 Search mode — search by keyword, category, or both, centered on any U.S. ZIP code. Filter by price range and condition, and sort by best match, recency, distance, or price.
- 🔗 Direct lookup mode — paste specific listing IDs or
offerup.com/item/detail/...URLs to fetch exactly those listings, always with full detail. - 🏷️ Category browsing — pick from OfferUp's full category tree (all 14 top-level departments and their subcategories) using the same
parent.childids the site itself uses (e.g.1.5for Video games & Consoles). - 🧾 Full listing detail — condition, description, seller profile and rating, all photos, shipping/pickup options, and category hierarchy, when
fetchDetailsis on. - ⏱️ Freshness filter — cap results to ads posted within the last N hours when sorting by recency.
- 🔁 Resilient to blocks — runs over a residential U.S. proxy so it isn't limited to whatever a single IP can see.
Because it runs on the Apify platform, you also get scheduling (track new listings daily), instant API and webhook access, and one-click export to JSON, CSV, Excel, HTML, or XML.
What data can you extract from OfferUp?
| Field | Description |
|---|---|
listingId, url | OfferUp's internal listing UUID and the public item URL |
title, price, formattedPrice | Listing title and price (raw and formatted, e.g. "$60") |
conditionText, flags | Condition label and flags like LOCAL_PICKUP |
locationName | City/state the listing is posted in |
image | Thumbnail {url, width, height} |
isFirmPrice, priceDropPercentage, formattedOriginalPrice | Pricing context |
_details.description, _details.condition | Full description and numeric condition score (needs fetchDetails) |
_details.photos | Every photo, in multiple sizes up to full resolution |
_details.owner.profile | Seller name, join date, rating average/count, response time |
_details.listingCategory.categoryV2 | Category hierarchy (l1Name, l2Name) |
_details.fulfillmentDetails | Local pickup / shipping availability and pricing |
_details.locationDetails | Latitude, longitude, ZIP code, distance |
_detailsStatus | success, not-found, or error for the detail request |
How to scrape OfferUp listings
- Click Try for free on the OfferUp Scraper page (no credit card needed to start).
- Enter a search keyword (e.g.
iphone 15), a ZIP code, and optionally a category and price range — or switch to direct lookup by pasting listing URLs intolistingIds. - Turn on
fetchDetailsto get seller info, photos, and category data for every result. - Click Start and watch results land in the dataset in real time.
- Export the finished dataset as JSON, CSV, Excel, HTML, or XML, or pull it via the API / integrations.
Input / Output
Example input:
{"maxItems": 50,"query": "playstation","zipCode": "94102","category": "1.5","minPrice": 50,"maxPrice": 500,"conditions": ["new", "used"],"fetchDetails": true}
Direct item lookup (skips search entirely):
{"maxItems": 2,"listingIds": ["50f175dd-7dfd-35ea-875e-2349b92554d5","https://offerup.com/item/detail/ac5f8f61-a479-3a3b-bd0b-6dbcea95ea9d"]}
Output example (truncated):
{"listingId": "ac5f8f61-a479-3a3b-bd0b-6dbcea95ea9d","title": "Backbone PlayStation","price": "60","formattedPrice": "$60","locationName": "Newark, CA","image": { "url": "https://images.offerup.com/...", "width": 250, "height": 250 },"url": "https://offerup.com/item/detail/ac5f8f61-a479-3a3b-bd0b-6dbcea95ea9d","_detailsStatus": "success","_details": {"condition": 100,"conditionDisplayText": "New","owner": { "profile": { "name": "Michael", "ratingSummary": { "average": 5, "count": 7 } } }}}
Download results as JSON, CSV, Excel, HTML, or XML from the Console, or via the Apify API.
Python
from apify_client import ApifyClientclient = ApifyClient("<YOUR_API_TOKEN>")run = client.actor("parsebird/offerup-scraper").call(run_input={"query": "playstation","zipCode": "94102","maxItems": 50,"fetchDetails": True,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["title"], item["formattedPrice"])
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });const run = await client.actor('parsebird/offerup-scraper').call({query: 'playstation',zipCode: '94102',maxItems: 50,fetchDetails: true,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Categories
The category input accepts any id from OfferUp's own category tree, in parent.child format (e.g. 1.5 for Video games & Consoles, 5.1 for Cars & Trucks). Pick one from the dropdown in the Input tab, which lists all 14 top-level departments (Electronics & Media, Home & Garden, Vehicles, Toys/Games/Hobbies, Sports & Outdoors, Collectibles & Art, Pet supplies, Health & Beauty, Wedding, Business equipment, Tickets, and more) and their subcategories. Leave it blank to search across all categories.
Use cases
- Deal hunting — search a category or keyword across a ZIP code and sort by price to find the cheapest listings.
- Local market research — track how many listings, and at what price, exist for a product in a given area.
- Lead generation — pull seller contact/profile data for a product category to build outreach lists.
- Price trend monitoring — schedule daily runs with
sortBy: "recent"andmaxAgeto catch new listings as they're posted. - Arbitrage / resale tools — compare
priceacross ZIP codes or categories to spot underpriced listings.
How it works
- The Actor opens a residential U.S. session against offerup.com and calls the same internal GraphQL API the website itself uses.
- In search mode, your ZIP code is resolved to coordinates, then the Actor pages through the results feed (using OfferUp's own cursor-based pagination) applying your price, condition, and category filters.
- In direct lookup mode, listing IDs are extracted from bare UUIDs or full item URLs, deduplicated, and fetched directly.
- When
fetchDetailsis on (or always, for direct lookups), each kept listing gets one extra request for its full detail: description, seller profile, photos, and category. - Every result is pushed to the dataset as soon as it's ready.
How much does it cost to scrape OfferUp?
This Actor uses the Pay-Per-Event pricing model — you only pay for what you get, with no separate compute charge.
| Event | Free | Bronze | Silver | Gold |
|---|---|---|---|---|
| Listing (per 1,000) | $1.49 | $1.29 | $1.09 | $0.99 |
| Detail (per 1,000, when fetchDetails is on) | $1.49 | $1.29 | $1.09 | $0.99 |
A search for 1,000 listings with fetchDetails on costs roughly $2.98 (Free plan) down to $1.98 (Gold plan). Leaving fetchDetails off (title/price/location only) roughly halves the cost. Apify's monthly platform usage credits apply to any plan.
Is it legal to scrape OfferUp?
Yes — scraping publicly available data is generally legal, as confirmed in cases like hiQ Labs v. LinkedIn. This Actor only collects listing information that's publicly visible on offerup.com to anyone browsing the site. You are responsible for how you use the collected data — always check the target site's terms of service and applicable law before reusing scraped data commercially. See Apify's blog post on web scraping legality for more detail.
FAQ
Does this use the official OfferUp API? No — OfferUp does not offer a public listings API. This Actor reads the same GraphQL data the offerup.com website itself loads, structured into clean JSON.
Why is _details sometimes missing?
_details is only added when fetchDetails is on (search mode) or always (direct listingIds lookups) and the request succeeds. Check _detailsStatus: not-found means the listing no longer exists or was removed; error means the detail request failed and can be retried.
What does category accept?
An id in parent.child format from OfferUp's own category tree, e.g. 1.5 for Video games & Consoles. Pick one from the dropdown in the Input tab — see Categories above for the full list.
Can I search outside the U.S.?
No — OfferUp is a U.S.-only marketplace, and zipCode must be a valid U.S. ZIP code.
Can I schedule this to run automatically? Yes. Use Apify's Scheduler to run it daily, weekly, or at any interval, and combine it with Apify's storage integrations (Google Sheets, Slack, Make, Zapier, webhooks) to get notified of new listings.
I found a bug or missing field — where do I report it? Open an issue on the Actor's Issues tab in Apify Console, or use the API directly for programmatic access.