OfferUp Scraper icon

OfferUp Scraper

Scrape OfferUp listings by keyword, location and radius. Returns 40+ fields per item: price, condition, GPS, full photo set, category tree and rich…

Start using this actor on Apify ↗Need a custom scraper?Contact us ↗

OfferUp Scraper at a glance

OfferUp Scraper is a ready-to-run Apify actor from abotapi for collecting ecommerce data. Its documented output includes id, change type (incremental mode), title, price and condition, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $2.20 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify.

Runs on
Apify cloud: console, API, schedules and integrations
Data type
Ecommerce, Automation, Developer Tools
Pricing
$2.20 per 1,000 results (Free plan), from $1.00 on paid plans
Output
Documented below · JSON, CSV, Excel
Inputs
23 options

Scrape OfferUp listings by keyword, location and radius. Returns 40+ fields per item: price, condition, GPS, full photo set, category tree and rich seller profiles (rating, items sold, join date, verification). Search and URL modes, 5 sort orders, price and condition filters.

What OfferUp Scraper can do

  • Two ways in. Keyword search with location, radius, price and condition filters, or paste OfferUp search and item URLs directly.
  • 40+ fields when Fetch full details is on, including GPS coordinates, the full photo set, a three-level category tree and a complete seller profile (rating, items sold, join date, response time, verification).
  • Five native sort orders, plus price range and multi-condition filtering, applied at the source rather than filtered after the fact.
  • Genuine price-drop detection. Compares OfferUp's own recorded original price against the current price, not just a low asking price.
  • Walks the whole catalogue by default. Max pages defaults to unlimited: the run walks every result page per query/URL until Max items, OfferUp's own last page, or a repeat-page guard stops it.
  • Resumable, delta-friendly runs. Point Resume from a previous run at an earlier run or dataset to collect only what it doesn't already have, and Incremental mode tracks a recurring search itself and tags what changed.

Choose what to collect

These inputs let you configure OfferUp Scraper - Listings, Prices, Sellers & Location Data. Open the actor on Apify to enter your values and review the current options.

Supported input fields
InputWhat it controls
modestring · requiredHow to start the scrape. 'search' builds OfferUp searches from your keywords + location + filters. 'url' walks the OfferUp search or detail URLs you paste (filter fields below are ignored in URL mode).

Choices: search, url

searchQueriesarrayOne or more keywords to search OfferUp for (e.g. 'iphone 14', 'mountain bike', 'sofa'). Each query is scraped independently.
locationstringCenter the search on a place: a US city ('Miami, FL'), a ZIP code ('33101'), or raw coordinates ('25.7617,-80.1918'). Leave empty to search near the connection's location (roughly nationwide).
radiusMilesintegerRadius in miles around the location to include listings from.
priceMinintegerOnly return listings priced at or above this amount.
priceMaxintegerOnly return listings priced at or below this amount.
conditionarrayFilter by item condition. Select one or more. Leave empty for any condition.
Show 16 more inputs
More input fields
InputWhat it controls
priceDropOnlybooleanOnly keep listings where the seller has lowered the price from OfferUp's own recorded original price (a genuine markdown, not just a low asking price). Only applies when mode = search. Price-drop data lives on the listing detail page, not the search results page, so turning this on auto-enables 'Fetch full details' for the run (and its per-item charge) even if left off below.
sortBystringOrder OfferUp returns results in.

Choices: best_match, -posted, distance, price, -price

urlsarrayPaste OfferUp URLs: search (https://offerup.com/search?q=...), a search page such as &page=2 (the walk starts there), category pages (/c/, /c//), legacy /explore/k/, or item detail URLs (https://offerup.com/item/detail/). Multi-URL supported. Search URLs page forward automatically; filter-mode fields are ignored. Other pages (/rentals, /jobs) and non-OfferUp URLs are skipped with a warning. Left untouched, the field scrapes one example of each supported shape.
listingIdsarrayBare OfferUp listing ids (for example 0b6f6c5e-1a2b-4c3d-8e9f-0123456789ab) or item detail URLs. Each id is read from OfferUp's listing data. Whenever ids are given the run reads those listings in URL mode, whatever the Mode field says; the sample URLs and search keywords that are filled in by default are not run. URLs you typed yourself in the URLs field are still scraped alongside the ids.
fetchDetailsbooleanVisit each listing page to add description, GPS coordinates, full photo set, category tree, fulfillment details and the complete seller profile (rating, items sold, join date, verification). Slower and adds a small per-item charge; leave off for fast basic listings. Always on when 'Price drops only' is set.
maxItemsintegerThe single cap on this run: stop after collecting this many listings (across all queries/URLs). Set 0 for unlimited.
maxPagesintegerOptional safety limit on result pages walked per query. Leave at 0 to walk the whole catalogue: the run stops at Max items, the site's own last page, or a repeat-page guard, not an artificial page cap.
resumeFromRunIdstringOptional. ID of a previous run of this actor (or a dataset ID). Listings already in that dataset are skipped, so this run returns only NEW listings (a delta). Combine both runs' datasets for the full set. Max items then counts only the new listings.
incrementalModebooleanFor a search you run on a schedule (e.g. daily): remembers this search's own listings between runs and tags each output row's changeType as NEW / UPDATED / UNCHANGED / REAPPEARED / EXPIRED, so you only need to look at what changed. Compared: every returned field (price, title, condition, status, photos, seller, etc.). Excluded from the comparison, but still returned in every row: discussionCount, sellerLastActive, sellerResponseTime, distanceMiles, isLocal (they drift with time or your exit location), and the query string of image URLs (imageUrl, photos[].url/listUrl, sellerAvatar) so rotating CDN parameters never count as a change. State is kept by this actor itself (a hash of your search/URLs + filters, or 'State key' below), unlike 'Resume from a previous run' above, you never paste a run/dataset id. Off by default so ordinary runs are unaffected.
stateKeystringOptional label naming the tracked baseline for Incremental mode. Leave empty to auto-derive one from your search/URLs + filters (two identical setups then share state automatically). Set a value to name a monitoring campaign explicitly, or to run two setups with otherwise-identical filters as separate baselines.
emitUnchangedbooleanWhen on, Incremental mode also returns and BILLS listings with no change since the last run (changeType UNCHANGED), instead of only NEW/UPDATED/REAPPEARED/EXPIRED. Off by default to keep recurring runs cheap.
emitExpiredbooleanWhen on, Incremental mode also returns and BILLS a row for each previously-tracked listing no longer found (changeType EXPIRED), only once a run completes a full scan of the tracked search (never on Resume, a Max items cap, or an error-stopped scan). Off by default.
ignoreFieldsForChangesarrayOptional. Field names to exclude from UPDATED change detection, in addition to the built-in exclusions listed under Incremental mode. Use a top-level name (e.g. sellerName) or a dotted path into nested data (e.g. photos.listUrl); lists are checked element by element. Ignored fields are still returned in every row and never appear in changedFields.
mcpConnectorsarrayOptionally send results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize one under Apify → Settings → API & Integrations, then select it here. Notion gets a rich page-per-item export; other connectors get a best-effort write/digest. Leave empty to skip; never changes the dataset output. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com).
notionParentPageUrlstringURL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors.
maxNotifyListingsintegerCap on items written to each connector per run. Does not affect the dataset.

Fields in the output

The documented dataset includes the fields below. Availability can depend on the source page and selected mode.

listingIdID (text)
changeTypeChange type (incremental mode) (text)
titleTitle (text)
pricePrice (text)
conditionTextCondition (text)
locationNameLocation (text)
urlURL (link)
imageUrlImage (image)
categoryL1NameCategory L1 (text)
categoryL2NameCategory L2 (text)
latitudeLat (number)
longitudeLon (number)
Show 26 more fields
sellerNameSeller (text)
sellerRatingRating (number)
sellerReviewCountReviews (number)
sellerIsTruYouTruYou (boolean)
postDatePosted (text)
changedFieldsChanged fields (incremental mode) (array)
firstSeenAtFirst seen (incremental mode) (date)
lastSeenAtLast seen (incremental mode) (date)
priceTextPrice text (text)
originalPriceOriginal price (number)
descriptionDescription (text)
distanceMilesDistance miles (number)
categoryL3NameCategory l3 name (text)
localPickupEnabledLocal pickup enabled (boolean)
shippingEnabledShipping enabled (boolean)
canShipToBuyerCan ship to buyer (boolean)
shippingPriceShipping price (number)
sellerPaysShippingSeller pays shipping (boolean)
buyItNowEnabledBuy it now enabled (boolean)
sellerIdSeller id (text)
sellerItemsSoldSeller items sold (number)
sellerDateJoinedSeller date joined (text)
sellerResponseTimeSeller response time (text)
sellerPublicLocationSeller public location (text)
photoCountPhoto count (number)
photosPhotos (array)

Example output

An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.

{
  "listingId": "00000000-0000-0000-0000-000000000000",
  "url": "https://offerup.com/item/detail/00000000-0000-0000-0000-000000000000",
  "title": "Sample Listing Title",
  "price": 799,
  "priceText": "$799",
  "isFirmPrice": false,
  "conditionText": "Used",
  "conditionCode": 40,
  "locationName": "Miami, FL",
  "latitude": 25,
  "longitude": -80,
  "distanceMiles": 4.9,
  "flags": [
    "LOCAL_PICKUP"
  ],
  "categoryL1Name": "Electronics & Media",
  "categoryL2Name": "Cell phones & Accessories",
  "categoryL3Name": "Smartphones",
  "description": "Full item description text.",
  "originalPrice": 899,
  "isOnSpecial": true,
  "savingsAmount": 100,
  "discountPercent": 11,
  "photos": [
    {
      "uuid": "0000",
      "url": "https://images.offerup.com/000-1440x1920.jpg",
      "width": 1440,
      "height": 1920
    }
  ],
  "photoCount": 1,
  "postDate": "2026-01-01T00:00:00.000Z",
  "localPickupEnabled": true,
  "shippingEnabled": false,
  "sellerName": "Jane Seller",
  "sellerRating": 5,
  "sellerReviewCount": 89,
  "sellerItemsSold": 564,
  "sellerDateJoined": "2016-01-01T00:00:00Z",
  "sellerResponseTime": "Responds in a few minutes",
  "sellerIsTruYou": true
}

Ways to use this data

  • Resale and arbitrage: monitor a category or keyword for genuine seller price drops to spot flip opportunities before they're gone.
  • Local market research: track pricing and condition mix for a product category across cities, ZIP codes or radii.
  • Recurring seller/category watch: schedule a search with Incremental mode on and review only new, updated or disappeared listings.
  • Lead generation for local services: pull listings in categories like furniture, electronics or vehicles alongside seller responsiveness and verification signals.
  • Marketplace data science: build a dataset of local pricing behavior over time using scheduled Incremental runs.

Before you run

Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.

Questions about this actor

What data does OfferUp Scraper return?

The documented output for OfferUp Scraper includes id, change type (incremental mode), title, price, condition, location, url and image. Availability of each field depends on the source page and the selected mode.

How much does OfferUp Scraper cost?

It costs $2.20 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.

Can I get only new or changed listings on a schedule?

Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only NEW and UPDATED rows for that search by default; unchanged listings are skipped unless Emit unchanged listings is on, and turning on Emit expired listings also gets you EXPIRED rows once a run completes a full scan, plus REAPPEARED rows on a later run for a listing that was marked gone that way.

Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the connector field to push listing summaries into Notion, Linear or Airtable.

Ready to collect with OfferUp Scraper?

Run it on Apify with your own input and export the results as JSON, CSV or Excel.