OfferUp Scraper: Resale Data for Any US ZIP avatar

OfferUp Scraper: Resale Data for Any US ZIP

Pricing

from $1.50 / 1,000 results

Go to Apify Store
OfferUp Scraper: Resale Data for Any US ZIP

OfferUp Scraper: Resale Data for Any US ZIP

Live OfferUp resale data from any US ZIP code you choose: keyword listing search, full item details, seller inventory, profiles, sold comps, and instant Slack or JSON deal alerts. Pick your market, then stream structured JSON to your dataset in seconds.

Pricing

from $1.50 / 1,000 results

Rating

0.0

(0)

Developer

Emmanuel

Emmanuel

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Categories

Share

OfferUp Real-Time Data — Live Resale Market Intelligence

Live OfferUp market data for vintage & thrift resellers: keyword listing search in any US market you choose by ZIP code, full item details, seller inventory tracking, seller profiles, sold comps, and instant deal alerts. Structured JSON streams to your dataset row-by-row while the run is still working — results start appearing in seconds.

⚠️ Free Apify plan notice: Free-tier accounts are limited to 2 results per run. Upgrade to any paid Apify plan for unlimited exports. This is stated here, in the Actor input form, and in the run log — it is a policy limit, not an error.

Who this is for

  • Vintage & thrift resellers sourcing undervalued inventory (cross-listers on Poshmark, eBay, Depop, Mercari, Grailed)
  • Consignment shop owners and pickers tracking competitor inventory and local market prices
  • Resale arbitrageurs hunting margin spreads on workwear, gorpcore, designer denim, furniture, and electronics
  • Fashion market researchers & pricing intelligence teams tracking sell-through and trend data
  • AI agents & automations that need structured resale market data through the Apify MCP server

What you can do with it

  • Find undervalued thrift & vintage inventory — search "carhartt detroit jacket", "vintage 90s levis 501", "patagonia fleece", "single stitch tee", "mid century lamp", or "y2k baby tee" and sort by just-listed to catch fresh steals before anyone else.
  • Source a market you don't live in — set Target location to any 5-digit US ZIP code (10001, 90210, 60601, 78701) and collect local inventory from that metro: great for remote picking, planning a buying trip, or comparing prices across cities.
  • Price comps & sell-through analysis — pull sold and completed items to compute real market averages, sell-through rates, and realistic resale margins before you buy.
  • Seller inventory monitoring — watch top sellers, thrift shops, and liquidators: their full active stock, new listings, and repricing moves.
  • Instant Slack / Discord deal alerts — pipe every matched item to a webhook the moment it is saved, so your pricing bot or phone buzzes on newly listed steals.
  • Multi-platform pricing sync — feed structured rows into Sheets, Airtable, Make, Zapier, n8n, or your own repricer.

Target location — pick your market by ZIP code

OfferUp is a local marketplace: it shows what is available around one area, and buyers usually collect in person. By default that area follows the connection running the Actor, which can sit in a completely different city than you expect — that is why an untargeted run sometimes returns stock from another state.

Set Target location and the choice becomes yours. Give it any 5-digit US ZIP code and every keyword search returns listings from that area:

Market you want to sourceTarget location
New York City10001
Los Angeles / Beverly Hills90210
Chicago60601
Austin, TX78701
Miami Beach, FL33139
Phoenix, AZ85004

How it behaves:

  • Local distance is measured from your ZIP. 10001 + 10 miles returns New York City listings; 90210 + 10 miles returns Los Angeles listings. The 50-mile maximum is the default and finds the most inventory.
  • It ships prefilled with 10001 (New York) so a first run gives real, local results no matter where the connection sits. Swap in your own ZIP, or clear the field to keep the connection's own area. More starting points: 90210 Los Angeles, 60601 Chicago, 78701 Austin, 33139 Miami Beach, 85004 Phoenix, 97209 Portland, 30303 Atlanta, 19103 Philadelphia.
  • A city name is not enough. A ZIP is exact and always pins to a real market, so use a ZIP (search "your city zip code" if you don't know it). A ZIP+4 like 90210-1234 works too — the four extra digits are ignored.
  • Every run confirms the area it locked onto, e.g. Target area resolved: Beverly Hills, CA 90210, before any listings are collected.
  • Rows keep their own location too. Each record still reports the listing's local_area and distance_miles, so per-item provenance is never lost.
  • If a keyword has nothing in that area, the Actor says so in the log — naming the area it searched — and keeps going with your other keywords instead of failing.

Features

FeatureWhat it doesOutput (featureType)
🔍 Listing SearchLive keyword search with category, condition, distance, price filters, and any target location (US ZIP)listing_search
✨ Full Details EnrichmentAdds description, item specifics (Brand, Size, Color, Material), full view count, shipping options, and seller context to the same search rowlisting_search (detailsFetched: true)
📦 Listing DetailsFull record for specific listings by URL or listing IDlisting_details
🏪 Seller ListingsFull active inventory of any seller, thrift shop, or liquidatorcloset_listings
👤 Seller ProfileSeller stats: display name, verification, followers, local area, inventory sizeseller_profile
🧾 Sold Item Comps / HistorySold and completed items for market comps, margins, and sell-throughsold_history
🔗 Scrape By URLDirect processing of any OfferUp URL — search results, category page, seller inventory, or a single listingscrape_by_url

Enrichment, not filtering: when Enrich with full listing details is on, every search result stays one row and gains deep fields in place (detailsFetched: true). No duplicate rows, no dropped items — every discovered item always reaches the dataset, so your run cost stays predictable. Enrichment adds a little extra time per listing.

Sold comps on a live marketplace: OfferUp keeps a live inventory, so sold history is collected from sold-state listings on a seller's inventory plus any sold listing URLs/IDs you provide. The Actor tells you in the log when a seller has no sold items available right now instead of pretending otherwise.

Quick start (10 results in seconds)

The Actor comes prefilled for an instant demo run:

  1. Click Start — no configuration needed.
  2. Defaults: Listing Search on, keywords carhartt detroit jacket, vintage 90s levis 501, patagonia fleece, 10 results per keyword, Local distance: Maximum (50 miles).
  3. Target location comes prefilled with 10001 (New York), so the demo returns real New York listings immediately. Replace it with your own ZIP — 90210 Los Angeles, 60601 Chicago, 78701 Austin, 33139 Miami Beach — or clear it to search the connection's own area.
  4. Watch the dataset fill row-by-row in real time.

Example resale searches that work well

GoalKeywordsFilters
Workwear flipscarhartt detroit jacket, carhartt vestcategory: Clothing, Shoes, & Accessories
Vintage denimvintage 90s levis 501, levis 550 orange tabcondition: Used
Gorpcorepatagonia fleece, arc'teryx shell, north face nuptsemax price: 60
Y2K / streetweary2k baby tee, vintage nba jersey, stussy 90ssort: Just listed
Furniture flipsmid century lamp, walnut sideboardcategory: Home & Garden
Electronics arbitragemacbook pro 2019, nintendo switch oledcondition: New / Open box

Full input reference

🔍 Listing Search (enableListingSearch, default on)

FieldTypeDefaultNotes
searchKeywordsstring list3 thrift examplesRequired when search is on. Any OfferUp search term.
searchLocationtext10001 (New York)Target location — 5-digit US ZIP code, prefilled with 10001 so the demo is local out of the box. Prefer 90210 (Los Angeles), 60601 (Chicago), 78701 (Austin), 33139 (Miami Beach)? Just type it. All keyword searches come from that area, and searchRadius is measured from it. Clear the field = the connection's own area. The run log names the resolved city, so you can confirm the area before trusting the rows.
searchMaxResultsinteger10Max results per keyword (1–200).
searchSortselectrelevancerelevance, newest (just listed), price_low_to_high, price_high_to_low, distance (closest first).
searchCategoryselectAll categoriesElectronics & Media, Home & Garden, Clothing Shoes & Accessories, Baby & Kids, Vehicles, Toys Games & Hobbies.
searchConditionselectAnyNEW, OPEN_BOX, REFURBISHED, USED, BROKEN, OTHER — the same values sellers pick when posting.
searchMinPrice / searchMaxPriceinteger—Price window in USD.
searchRadiusselect50 (Maximum)Local distance from searchLocation (or from the connection's area when no location is set): 5, 10, 20, 30, or 50 miles. Wider always finds more.
searchFetchFullDetailsbooleanfalseEnrich with full listing details — merges description, item specifics, gallery, view count, shipping options, and seller context into the same row.

📦 Listing Details (enableListingDetails, default off)

FieldTypeNotes
listingUrlsstring listFull item URLs (https://offerup.com/item/detail/...).
listingIdsstring listListing IDs (the id at the end of an item URL).

🏪 Seller Listings (enableSellerListings, default off)

FieldTypeDefaultNotes
sellerIdsstring list—Seller IDs (the numeric id in a seller's profile URL, e.g. 91145407). Shared by Seller Listings, Seller Profile, and Sold Comps. Tip: every listing row this Actor exports includes the seller ID — feed one straight back in.
sellerMaxListingsinteger30Max active listings per seller (1–500).

👤 Seller Profile (enableSellerProfile, default off)

Uses the same sellerIds list. One row per seller.

🧾 Sold Item Comps / History (enableSoldHistory, default off)

Uses the same sellerIds list plus any listingUrls / listingIds you provide.

FieldTypeDefaultNotes
soldMaxItemsinteger30How many of a seller's items to check for sold state (1–500).

🔗 Scrape By URL (enableScrapeByUrl, default off)

FieldTypeNotes
scrapeUrlsstring listAny OfferUp search URL, category URL, seller profile URL, or single listing URL. The page type is detected automatically.

Run volume

There is no single global cap — each feature section controls its own volume:

  • Listing Search → searchMaxResults (per keyword)
  • Seller Listings → sellerMaxListings (per seller)
  • Sold Comps → soldMaxItems (per seller)
  • Listing Details & Scrape By URL → the number of URLs/IDs you paste

🔔 Delivery

FieldTypeDefaultNotes
webhookUrlstring—Optional. Every record is also POSTed here in real time.
webhookFormatselectjsonjson (full record) or slack (Slack-ready message).

🌐 Connection

FieldTypeDefaultNotes
proxyConfigurationproxy editorApify RESIDENTIAL, country USResidential connections are strongly recommended — OfferUp localizes results by area, and residential connections deliver the most reliable results at scale.

Output schema (field reference)

One dataset row per item. Filter views by featureType: listing_search, listing_details, closet_listings, seller_profile, sold_history, scrape_by_url.

item_id — listing ID · item_url, url — item/seller URL · featureType — producing feature · scrapedAt — ISO timestamp · position — rank where found · pageType — detected page kind (URL feature)

Pricing

current_price · original_price · currency (USD) · discount_percentage · price_drop_amount · is_firm_price (seller marked price as firm)

Product

title · description · condition (New / Open box / Refurbished / Used / For parts / broken) · condition_text (raw marketplace value) · category · item_specifics (seller attribute pairs such as Brand, Size, Color, Material) · brand · size · color · material · quantity · sku · views_count · is_newly_listed (≤ 7 days) · time_since_listed · badges

Local marketplace context

local_area (city, state) · distance_miles · distance_unit · local_pickup_available · shipping_available · shipping_options

Images

main_image_url · additional_image_urls

Timing & lifecycle

created_at · updated_at · sold_at · status (available / sold / reserved / not_for_sale / deleted) · is_sold · is_stale · is_removed · is_archived · is_unlisted

Seller

seller_id · seller_username, seller_display_name · seller_verified · seller_location

Seller profile rows

display_name · full_name · followers · total_listings · city / state · is_verified · inventory_has_more

Run marker

detailsFetched — true when a search row was enriched in place (still one row per listing).

Webhook integration

Every record is always written to the dataset. Add webhookUrl and each record is additionally POSTed in real time — perfect for instant deal alerts.

Slack format (webhookFormat: "slack") — paste a Slack Incoming Webhook URL; messages render like:

:shopping_bags: *Carhartt Detroit Jacket XX-Large Brand New*
*Type:* listing_search • *Price:* USD 130 • *Condition:* New • *Area:* SeaTac, WA • *Seller:* 93058422 • 11 views
<https://offerup.com/item/detail/...|Open on OfferUp>

JSON format (webhookFormat: "json") — the full record object, one POST per row. Works with Discord (via /webhooks), Zapier, Make, n8n, or your own pricing bot:

{
"featureType": "listing_search",
"title": "Carhartt Detroit Jacket XX-Large Brand New",
"current_price": 130,
"condition": "New",
"views_count": 11,
"local_area": "SeaTac, WA",
"distance_miles": 4.2,
"seller_id": "93058422",
"item_url": "https://offerup.com/item/detail/...",
"scrapedAt": "2026-09-27T12:00:00.000Z"
}

Webhook delivery is best-effort: a slow or failing webhook URL never blocks or breaks the run or the dataset writes.

Using with AI agents (MCP)

The Actor works great through the Apify MCP server with Claude Desktop, Cursor, LangChain, or any MCP client:

  1. In your MCP client config, add the Apify MCP server with your APIFY_TOKEN.
  2. Expose this Actor as a tool (Actor ID: ~your-username/offerup-real-time-data).
  3. Ask natural-language questions like:
    • "What is the average sold price for a 90s Carhartt J97 jacket on OfferUp?"
    • "Find Patagonia fleece listings under $30 posted today and Slack me the deals."
    • "Watch seller 91145407's inventory and tell me when they list Levis 501s under $25."

The Actor returns clean, structured rows — no cleanup needed for LLM pipelines.

Free-tier limits (paid-only features)

PlanBehavior
FreeCapped at 2 results per run (default). The run finishes cleanly with a clear log message — this is a policy limit, not an error.
Any paid plan (Bronze+)No caps — full output.

Owner-side configuration (Apify Console → Actor → Environment variables, not visible to users):

  • FREE_TIER_MODE = limit (default) or block (free users get 0 results with an upgrade message).
  • FREE_TIER_MAX_ITEMS = 2 (default).

Paying users are detected automatically from platform run context — nothing to configure per-run.

FAQ

Do I need my own connection setup? No. The Actor ships preconfigured for Apify Residential, US default. Residential connections are recommended because OfferUp localizes results by area. If you use your own provider, point the proxy editor at it and keep the country set to US.

Why did my free run stop at 2 items? That's the free-plan cap described above — it applies to every Apify Actor on the free plan. Upgrade to any paid Apify plan and the cap disappears automatically; no code or config change needed.

How fresh is the data? Every run collects live data at the moment you press Start. "Just listed" sort plus webhooks is the recommended combo for deal-alert workflows. Typical usage: schedule runs every 5–30 minutes on watchlists.

How do I get listings from a specific city? Set Target location to that city's 5-digit US ZIP code — 10001 for New York, 90210 for Los Angeles, 60601 for Chicago. Every keyword search then returns listings from that area, and Local distance is measured from it. The log confirms the resolved area (Target area resolved: Chicago, IL 60601) so you can verify it before reading the dataset. Leave the field empty to search the connection's own area instead.

Why did my keyword come back empty? OfferUp is a local marketplace: a keyword with nothing available in the searched area returns nothing. Set Target location to a busier metro (e.g. 10001 or 90210), widen Local distance to Maximum (the default), or try a broader keyword. The Actor logs a clear line — including the area it searched — when this happens and continues with your other keywords.

Will I get rate-limited or blocked? The Actor paces keyword work with small randomized pauses, reuses a warmed-up session, retries on a fresh connection when a local area looks thin, and routes through residential connections — the same safeguards used at 10,000+ item scale. Keep concurrency defaults and it just works.

What does "Enrich with full listing details" cost me in time? It adds a little extra time per listing to hydrate full product fields in the same row. With it off you get fast search cards (price, title, image, condition, area, pickup flag). Either way, every discovered item is saved — items are never filtered out.

Can I track sellers instead of keywords? Yes — Seller Listings, Seller Profile, and Sold Comps all share the sellerIds list. Combined with a schedule, you get a competitor inventory feed and sell-through history. Every listing row includes the seller ID, so you can chain features in two runs.

How do I compute sell-through rate? Pull Sold Comps for a seller, then divide sold items by (sold + active seller listings) for the same seller — both features use the same seller IDs, so one input drives both sides of the ratio.

Is any raw source payload included? No — rows contain only the clean, structured fields documented above. There is no raw-data option and no internal payload dumps in webhooks.

Does the run timeout? Runs support up to 10,000 seconds (about 2.7 hours) per run, which covers 10,000+ item exports at default pacing. For larger volumes, run multiple scheduled passes with smaller per-section limits.

Pricing model

This Actor uses Pay-Per-Event (PPE): you are charged one result event per dataset row saved. Set a max spend per run in Apify Console — when your limit is reached, the Actor stops gracefully, writes its summary, and exits cleanly without errors.

Disclaimer

This Actor is not affiliated with, endorsed by, or sponsored by OfferUp. It provides access to publicly available marketplace information for research and business intelligence. Respect OfferUp's Terms of Service when using collected data.


Built for the thrift & resale community. Happy flipping! 🧥