OfferUp Scraper

A local marketplace,
as a price list.

Paste an OfferUp search, explore or item URL and get the listings back as rows: the title, the asking price, the city and state, a thumbnail and a link straight to the listing. One row per item, ranked in the order OfferUp showed them. No account, no proxy pool, no parser to keep alive.

one-time 500 free rows$0.002 per row after10 columnsCSV · XLSX · JSON
How it works

A URL in,
the listings out.

The input is whatever OfferUp page you are looking at - a search you ran, a category you are browsing, or a single item.

  1. STEP 1Sign in to the platform.
  2. STEP 2Open the OfferUp Scraper.
  3. STEP 3Paste offerup.com search, explore or item-detail URLs, one per line - or upload a CSV, XLSX, TXT or Parquet file.
  4. STEP 4Set a limit per query, or leave it at zero to take everything.
  5. STEP 5Choose your output format.
  6. STEP 6Click Get Data.

One row per listing, each tagged with the query it came from - so a run across twenty searches still reconciles back to your input list.

Why teams use it

What the asking price
actually is, locally.

Three URL shapes, one input box

A search you already ran, a category you are browsing, or a single item - paste whichever you have. There is no separate mode to pick and nothing to reformat before the run.

Price with the place attached

Every row carries the city and the state alongside the number, so a price comparison stays honest about geography. Second-hand pricing is local, and a national average hides that.

Rank preserved, not re-sorted

The JSON records each listing's position within its query, one to n, in the order OfferUp returned it. Sort the file however you like afterwards - the original ordering is still in there.

What you get back

Ten columns,
one row per listing.

Each row carries the listing as OfferUp's results show it: the title, the asking price, the city and state, a thumbnail image and a permalink to the item itself.

Titles come back verbatim, exactly as the seller typed them, with no cleanup applied - which is what you want if the next step is matching listings to a catalogue. The column list below is the header row of real runs rather than a specification, and the useful part of it is which columns arrived empty on every single row of the sample. Those are named, not glossed over.

Data dictionary

Ten columns in the file,
eleven in the JSON.

Taken from the header row of real runs, identical across them and identical to the column list the platform ships.

query
The OfferUp URL you submitted, repeated on every row that came from it.
title
The listing title exactly as the seller typed it, with no cleanup. Filled on every row.
price
The asking price as a bare number in a string - no currency symbol, no thousands separator. Usually a whole number (30), sometimes two decimals (24.99). Filled on every row.
condition
Intended for the seller’s condition label.
location
Where the item is, as City, ST with a two-letter US state code. Filled on every row.
firm_price
Intended for the firm-price flag.
miles
Intended for the distance from the search location.
flags
A listing marker. Every row in the sample carried the single literal value LOCAL_PICKUP - no other value appeared, so treat a second value as possible but untested.
image
A thumbnail on images.offerup.com, roughly 250px on its longest side and varying in aspect. This is the results-grid image, not the full-resolution listing photo.
listing_url
Permalink to the item: https://offerup.com/item/detail/ plus the listing’s id. Filled on every row.
position
1-based rank within the query, in the order OfferUp returned the listings - contiguous from 1 to n in every run. JSON only; the CSV and XLSX exports stop at ten columns.

Read this before you write code against it. position exists only in the JSON, so a CSV or XLSX export has ten columns rather than eleven. There is no seller and no posting date anywhere in this output, because the results OfferUp renders do not carry them. And the form takes an item-detail URL as well as search and explore URLs, which is worth exercising against your own list before you build on it.

Run controls

Set on the job,
not in the spreadsheet.

A per-query limit decides what a run costs and how much lands in the file. It is chosen before the job starts, alongside how you hand over the list of URLs.

Search URL Explore URL Item-detail URL Limit per query Zero for everything Paste one per line CSV upload XLSX upload TXT upload Parquet upload
Common workflows

Three jobs people
most often run here.

A few examples of how teams use second-hand marketplace listings to answer a question they actually have.

Resale

Price a category before you buy it

Run the same search across a handful of metros and read the asking prices with the city attached. What a used item fetches in Wichita and what it fetches in Portland are different numbers, and the location column is what lets you say so.

Resellers · Flippers
Retail

Watch the second-hand floor under your product

Used listings set the price a new unit competes against. Export the category on a schedule and you can see the resale floor move instead of guessing where it sits.

Pricing · Category
Research

Map supply across a region

Explore URLs cover a category rather than a keyword, so a run returns what is actually listed near a place. Counts and prices by city turn into a picture of local supply that no single search gives you.

Research
Pricing

Pay only for the listings
you actually pull.

No subscription, no minimum, no recurring bill. Your first 500 rows are on us - after that, pay-as-you-go at the same flat rate as every other scraper here.

Free tier

500 free rows - $0

Every new account, one-time. No credit card required. Per-query limits, file upload and every export format included.

$0 forever
Pay-as-you-go

$0.002 per row, after the free tier

Roughly $2 per 1,000 listings. The pre-flight estimator shows the row count and credit cost before a run starts - no surprise bills, no compute units to translate.

Most popular
Volume

Custom · high volume

Volume pricing, dedicated workers and an SLA for continuous monitoring or very large historical pulls. Tell us your numbers and we will quote.

Talk to us
10% off your first paid run.Use code LIVESCRAPER10 at checkout.
Sign up
Pairs well with

The second-hand price,
and the new one beside it.

The legal bit

Is it legal to scrape
OfferUp listings?

Short answer: yes for the public listing content - and this export carries no seller identity at all.

Listings on OfferUp are published to be found. The title, the asking price, the city and state, the thumbnail and the link are shown to anyone who runs the search, signed in or not. Collecting publicly visible listing data for price research is long-established practice, and nothing here touches a login, a message thread or a paywall.

One point is worth stating plainly rather than burying. There is no seller in this output - no name, no profile link, no rating, no avatar - and no posting date either. The columns are the item and where it is, nothing about the person selling it. That is a property of what the results pages render, not a filter we apply afterwards, and it means a price study built on this data has no personal data in it to begin with.

OfferUp's own terms restrict automated access, so this is a terms question as well as a legal one - if you have a contractual relationship with the site, check it. We run no third-party trackers on the data layer, and your exports auto-delete after 30 days.

livescraper.app · principles
Public listing content only
No logins, no accounts touched
No seller identity in the export
GDPR-aligned by default
Exports auto-delete (30 days)
Check OfferUp's own terms before scaling.
Common questions

Things people
ask before signing up.

The questions we hear most. Anything else? Talk to us - humans, not bots, write the answers.

How do I scrape OfferUp listings?+
Using the OfferUp Scraper:
  1. Sign in to the platform.
  2. Open the OfferUp Scraper.
  3. Paste offerup.com search, explore or item-detail URLs, one per line - or upload a CSV, XLSX, TXT or Parquet file.
  4. Set a limit per query, or leave it at zero to take everything.
  5. Choose your output format.
  6. Click Get Data.
What kind of OfferUp URL do I paste?+
Any of three: a search URL like https://offerup.com/search?q=toaster, an explore URL that covers a category, or an item-detail URL for a single listing. They all go in the same box, one per line, and there is no mode to switch between them.
What comes back for each listing?+
Ten columns: the query you submitted, the title, the price, the condition, the location, the firm-price flag, the distance in miles, the listing flags, the thumbnail image and the listing URL. The JSON adds an eleventh, position, which the CSV and XLSX exports omit.
Why are the condition, firm_price and miles columns empty?+
Because they did not carry values in our testing. We are telling you this instead of letting you find it during analysis: plan for those three as empty rather than as fields you can filter on. The flags column behaved the same way in reverse, carrying the single value LOCAL_PICKUP.
Is there a seller name or a posting date?+
No, and neither exists in this output. There is no seller name, profile link, rating or avatar, and no date the listing was posted. The columns describe the item and where it is, not the person selling it or when they listed it.
What format is the price in?+
A bare number inside a string - no currency symbol and no thousands separator. It is usually a whole number like 30 and sometimes carries two decimals like 24.99. Cast it before you do arithmetic on it.
Is the image the full-size listing photo?+
No. The image column holds the results-grid thumbnail from images.offerup.com, roughly 250 pixels on its longest side, and its aspect ratio varies by listing. It is the right size for a preview and the wrong size for anything that needs detail.
How much does it cost?+
The first 500 rows are free and one-time, with no credit card. After that it is $0.002 per row - about $2 per 1,000 listings - which is the same flat rate as every other scraper on the platform. The estimator shows the cost of a run before it starts.

Your first 500 listings,
on the house.

500 one-time free rows on every new account - no expiry. After that it is $0.002 per row, pay-as-you-go - no card on file until you say so.

Activates instantly · no card required

Scrape OfferUp marketplace listings at scale

Livescraper's OfferUp Scraper turns marketplace URLs into listing data. You submit offerup.com search, explore or item-detail URLs - typed one per line, or uploaded as a CSV, XLSX, TXT or Parquet file - cap the rows per query if you want to, and download the results as a clean CSV, Excel or JSON file.

Each row carries the listing as OfferUp's results show it: the title exactly as the seller typed it, the asking price as a bare number, the city and two-letter state code, a thumbnail from images.offerup.com and a permalink to the item. The JSON adds the listing's rank within its query, contiguous from one, so the original result ordering survives however you sort the file afterwards.

Resellers run the same search across several metros and compare asking prices with the city attached, because second-hand pricing is local and a national average hides that. Pricing teams export a category on a schedule to watch the second-hand floor their new units compete against. Researchers use explore URLs, which cover a category rather than a keyword, to map what is actually listed near a place.

Two properties of this dataset are worth knowing before you build on it. Three columns - condition, firm_price and miles - did not carry values in our testing, and flags carried the single value LOCAL_PICKUP; plan for them as empty rather than as filters. And there is no seller identity and no posting date anywhere in the output, because the results pages do not render them. Start free: your first 500 rows cost nothing and need no credit card, and after that it is $0.002 per row, flat.