# OfferUp Scraper | US Marketplace Listings & Prices (`muhammadafzal/offerup-us-marketplace-scraper`) Actor

Scrape public OfferUp US marketplace listings for titles, prices, locations, conditions, seller details, images, shipping availability, and listing URLs from keyword searches or filtered explore pages.

- **URL**: https://apify.com/muhammadafzal/offerup-us-marketplace-scraper.md
- **Developed by:** [Muhammad Afzal](https://apify.com/muhammadafzal) (community)
- **Categories:** E-commerce, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 listing returneds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## OfferUp Scraper | US Marketplace Listings & Prices

Extract structured public listings from the OfferUp US marketplace. The Actor accepts OfferUp explore URLs or keywords and returns one normalized dataset item per unique listing.

### What it returns

- Listing ID, title, URL, price, and currency
- Location, condition, category, and description when publicly available
- Seller name, rating, and review count when exposed on the page
- Image URLs, shipping availability, and posted time when exposed
- A `SUMMARY` key-value record with page counts, warnings, and blocked-state diagnostics

### Input examples

Keyword search:

```json
{
  "searchQueries": ["iphone", "gaming chair"],
  "maxResults": 50,
  "maxPagesPerQuery": 3,
  "proxyMode": "apify"
}
```

Filtered public URL:

```json
{
  "startUrls": [
    { "url": "https://offerup.com/explore/k/home" }
  ],
  "maxResults": 25,
  "includeDetails": true
}
```

`startUrls` takes precedence over `searchQueries`. OfferUp can require a US-compatible network location. `proxyMode: "apify"` is the default and uses US residential Apify Proxy routing. Use `direct` only from a permitted US-compatible network, or `custom` only when the Actor owner configured the custom proxy secret. Use only permitted public access paths; this Actor does not log in, use cookies, bypass CAPTCHAs, or defeat access controls.

The deployed private version can use an owner-configured secret custom proxy through `OFFERUP_PROXY_URL` when `proxyMode` is explicitly set to `custom`. Credentials are never accepted as ordinary Actor input and are not written to logs or datasets.

### Pricing

Pay per event:

- Actor start: `$0.01` per run
- Listing returned: `$0.01` per unique listing written to the default dataset

Platform usage and proxy costs follow the Actor’s live Apify pricing configuration. Set a run maximum charge when testing.

### Limitations and truthful outcomes

OfferUp pages are location-sensitive and may return a geolocation gate, challenge page, or no-match page. A zero-listing page is reported as empty only when OfferUp exposes an explicit no-results message; an unrecognized blank or decoy response is reported as blocked. Blocked runs write diagnostics to the terminal status and `SUMMARY` rather than creating placeholder listings. HTML structure can change; listings are extracted from public page links, JSON-LD, and page-owned markup.

Use the data in accordance with OfferUp’s terms, applicable law, and the rights of listing users. Do not use the Actor to access private accounts or restricted content.

# Actor input Schema

## `searchQueries` (type: `array`):

Use for public OfferUp keyword searches when you do not already have a filtered URL. Example: \["iphone 15", "gaming chair"]. Searches are routed through OfferUp explore URLs.

## `startUrls` (type: `array`):

Optional public OfferUp explore/search URLs. Use this for category, price, condition, or location filters already applied on OfferUp.

## `maxResults` (type: `integer`):

Maximum unique listings to return and bill for. Use 1 for a low-cost canary; allowed range is 1–500.

## `maxPagesPerQuery` (type: `integer`):

Maximum pagination depth per query or start URL. More pages use more requests.

## `includeDetails` (type: `boolean`):

Open each public listing page to enrich description, seller, condition, shipping, and image fields. This increases run time and request volume.

## `maxRequestRetries` (type: `integer`):

Bounded retries for transient page failures. Use 0–4; default is 2.

## `proxyMode` (type: `string`):

Choose how OfferUp requests are routed. Use Apify US residential for normal runs (default), Direct only from a permitted US-compatible network, or Owner custom only when the Actor owner configured OFFERUP\_PROXY\_URL.

## `proxyConfig` (type: `object`):

Configure Apify Proxy groups for the apify network route. The legacy useApifyProxy switch remains supported when proxyMode is omitted; proxyMode takes precedence.

## Actor input object example

```json
{
  "searchQueries": [
    "iphone"
  ],
  "maxResults": 50,
  "maxPagesPerQuery": 3,
  "includeDetails": false,
  "maxRequestRetries": 2,
  "proxyMode": "apify",
  "proxyConfig": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `results` (type: `string`):

Dataset URL containing one record per unique public OfferUp listing.

## `summary` (type: `string`):

Key-value record containing page counts, warnings, and blocked-state diagnostics.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("muhammadafzal/offerup-us-marketplace-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {}

# Run the Actor and wait for it to finish
run = client.actor("muhammadafzal/offerup-us-marketplace-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call muhammadafzal/offerup-us-marketplace-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,muhammadafzal/offerup-us-marketplace-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/Md3nmSeg1eD2PpKdS/builds/JhwvpRXmYOhJBZjH6/openapi.json
