
TikTok Shop Scraper
scrape.ly/store/shelfbright/tiktok-shop-scraperE-commerceSocial media
1 monthly user

Scrape OfferUp listings by keyword, category or search link around any US ZIP code: title, price, location, condition, photos, and with full details the description, post date, seller rating and vehicle data. No login needed.
Scrape OfferUp marketplace listings by keyword, category or search link around any US ZIP code. You get the title, price, location, condition and photo of every listing, and with full details also the description, post date, all photos, seller rating, shipping options and vehicle data (make, model, year, miles, VIN). No login and no browser: a search of 20 listings usually finishes in a few seconds.
iphone), or paste OfferUp search, category or item links.10001 for New York, 94102 for San Francisco).| Field | What it does |
|---|---|
queries | Search keywords, one per line. Each is searched around every ZIP code. |
zipCodes | US ZIP codes to search around. Without one, searches run around New York (10001). |
startUrls | OfferUp search links, category links (/c/..., /explore/k/...) or item links. |
listingIds | Listing IDs or item links to fetch directly, always with full details. |
maxItems | Listings per search (keyword or link × ZIP code). 0 = all the site shows (about 2,000). |
category, minPrice, maxPrice, conditions, searchRadius, sortBy | Filters, the same as on the website. |
maxAge | Only listings posted within this many hours (needs full details). |
fetchDetails | Open every listing for its full details (extra event per listing). |
{
"queries": ["iphone 15", "ps5"],
"zipCodes": ["10001", "94102"],
"maxItems": 50,
"minPrice": 100,
"maxPrice": 900,
"conditions": ["used", "openBox"],
"sortBy": "recent",
"fetchDetails": true
}
| Field | Description |
|---|---|
listingId, url | OfferUp listing ID and link |
title, price, formattedPrice | Title and asking price (USD) |
formattedOriginalPrice, priceDropPercentage | Price before a price drop, when the seller lowered it |
locationName, flags | City and state; flags such as LOCAL_PICKUP or shipping |
imageUrl, image, videoUrl | Main photo (and video when there is one) |
vehicleMiles | Mileage shown on vehicle listings |
searchQuery, searchZipCode, searchCategory, searchUrl, position | Which search found the listing, and where it ranked |
description, condition, postedAt, state, isSold | With details: description, condition, post date and status |
categoryId, categoryPath, latitude, longitude, zipCode | With details: category and approximate location |
photos, photoCount, attributes, vehicle | With details: all full-size photos, item attributes, vehicle specs |
sellerId, sellerName, sellerUrl, sellerRating, sellerRatingCount, sellerItemsSold, sellerVerified, sellerJoinedAt, sellerLastActive, sellerIsBusiness, sellerPhone, sellerWebsite | With details: the seller's public profile |
shippingAvailable, shippingPrice, localPickup, buyNowEnabled | With details: how the item can be bought |
_details, _detailsStatus | With details: the full listing record as OfferUp returns it |
Example (one listing with details, trimmed; the seller is fictional):
{
"listingId": "80998dfe-ed92-3785-8a9b-dcc116b099ff",
"url": "https://offerup.com/item/detail/80998dfe-ed92-3785-8a9b-dcc116b099ff",
"title": "Premium iPhone 14 Pro MagSafe Phone Case Purple",
"price": 20,
"formattedPrice": "$20",
"locationName": "New York, New York",
"flags": ["LOCAL_PICKUP"],
"imageUrl": "https://images.offerup.com/8BWTNX587-1eOGe6yGQ6tTur9mw=/250x444/d2f8/d2f891f18d8e4166bf97ee144039244c.jpg",
"searchQuery": "iphone",
"searchZipCode": "10001",
"position": 1,
"description": "Purple iPhone case with a MagSafe-compatible magnetic ring cutout. Shows minor wear.",
"condition": "Used",
"postedAt": "2026-10-20T23:42:57.748Z",
"state": "LISTED",
"categoryPath": "Electronics & Media > Cell phones & Accessories",
"zipCode": "10019",
"photoCount": 2,
"sellerName": "Jamie Rivera",
"sellerRating": 5,
"sellerRatingCount": 10,
"sellerItemsSold": 17,
"sellerVerified": true,
"shippingAvailable": false,
"localPickup": true,
"scrapedAt": "2026-10-21T01:41:16.827Z"
}
Is it legal to scrape OfferUp? The actor reads public listing pages that anyone can see without an account. You are responsible for how you use the data, including personal data such as seller names, under the laws that apply to you (for example GDPR or CCPA).
Do I need an OfferUp account or my own proxy? No. No login or cookies are used. The default datacenter proxy works well; residential is available in the proxy settings and is pinned to the US.
How many results can I get? OfferUp shows up to 50 pages (about 2,000 listings) per search. For more, add ZIP codes or narrower keywords; duplicates across searches are saved once.
Why are some fields empty?
Without full details a listing has only what the search results show (title, price, location, photo). Condition, description, seller and post date come with Fetch full listing details. Some fields, such as priceDropPercentage, sellerPhone or vehicle, exist only for some listings.
Why do I get fewer listings than Max results per search? Your filters or area may match fewer listings, or the max age filter skipped older ones. The run's status message says what happened.
Can I schedule it or use the API? Yes. Schedule runs in the console, or start them through the API and read the dataset as JSON, CSV or Excel.
Every field below can be set in the run form, passed through the API, or saved as a task. Unset fields fall back to the defaults shown.
queriesarrayOptionalSearch keywords
What to search for on OfferUp, one keyword per line (for example iphone, sofa, honda civic). Each keyword is searched around every ZIP code below.
zipCodesarrayOptionalZIP codes
US ZIP codes to search around, one per line. Add several to cover more areas; listings found in more than one area are saved once. Searches without a ZIP code run around New York (10001).
startUrlsarrayOptionalOfferUp links
OfferUp search links (offerup.com/search?q=...), category links (offerup.com/c/... or offerup.com/explore/k/...) or item links (offerup.com/item/detail/...). Filters in a search link (price, sort, condition, distance) are kept.
listingIdsarrayOptionalListing IDs
OfferUp listing IDs or item links to fetch directly, with full details. Each listing found is saved once.
maxItemsintegerOptionaldefault 20Max results per search
How many listings to save for each keyword, link or category in each ZIP code. 0 = everything the site shows (up to about 2,000 per search).
categoryenumOptionalCategory
Only listings in this category. Works on its own (browse a whole category) or together with keywords.
minPriceintegerOptionalMin price (USD)
Only listings at or above this price. 0 = no minimum.
maxPriceintegerOptionalMax price (USD)
Only listings at or below this price. 0 = no maximum.
conditionsarrayOptionalCondition
Only listings in these conditions. Leave empty for any condition.
searchRadiusenumOptionalDistance
How far from the ZIP code to search. The site's default is 30 miles.
sortByenumOptionaldefault "bestMatch"Sort by
Order of the results.
maxAgeintegerOptionalMax age (hours)
Only listings posted within this many hours. Needs full details (the post date is on the listing page). Works best with Sort by: Newest first, which also stops the search early. 0 = any age.
fetchDetailsbooleanOptionaldefault falseFetch full listing details
Also open every listing for its description, post date, condition, all photos, category, exact location and ZIP code, seller (name, rating, items sold, verified, joined, phone for businesses), shipping options and vehicle data (make, model, year, miles, VIN). Charged as an extra event per listing.
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["DATACENTER…Proxy
Proxy servers used to reach OfferUp. Datacenter works well for this site.
Every run writes its results to a dataset. Preview it in the dashboard, then export it or read it through the API.
| Field | Type | Description |
|---|---|---|
| imageUrl | any | Image |
| title | any | Title |
| price | any | Price ($) |
| locationName | any | Location |
| conditionText | any | Condition |
| flags | any | Flags |
| isFirmPrice | any | Firm price |
| url | any | Listing |
| searchQuery | any | Keyword |
| searchZipCode | any | ZIP |
You pay for the events the actor reports, such as each result or page it produces. Platform usage is included in the event prices.
| Event | Charged when | Price |
|---|---|---|
| Listing | Charged for each OfferUp listing saved. Invalid inputs, listings that no longer exist and searches with no results are free. | $0.0015 |
| Listing details | Charged for each listing saved with its full details (description, post date, photos, seller, shipping, vehicle data), when Fetch full listing details is on or for listing IDs. | $0.0015 |
Run this actor from your own code. Swap in your API token and the examples work as-is.
import { ScrapelyClient } from 'scrapely-client'
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN })
// Start the actor and wait for the run to finish.
const run = await client.actor('shelfbright/offerup-scraper').call({
"queries": [
"iphone"
],
"zipCodes": [
"10001"
],
"maxItems": 20,
"proxyConfiguration": {
"useScrapelyProxy": true,
"scrapelyProxyGroups": [
"DATACENTER"
]
}
})
// Read the dataset the run produced.
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)Tokens live in your account settings. Keep them server-side: a token carries the full permissions of your account.
Connect the Scrape.ly MCP server once and your agent can run this actor as a tool. Pick your tool:
Fetch scrape.ly/agents.md and run shelfbright/offerup-scraperPaste into Claude Code, Codex, Cursor or any AI agent. It signs you in once in the browser.
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp?tools=actors,runs,storage,docs&actors=shelfbright/offerup-scraper"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
No examples yet
The developer hasn't published example inputs for this actor.
Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.