# OfferUp API

> OfferUp returns local sale listings, prices, and seller details, available as a workflow and API.

OfferUp searches items for sale near a US city or ZIP code, returning listing titles, prices, conditions, seller details, and links. Search listings requires a query and US location; optional inputs include price range, condition, sort order, result count, and maximum distance.

- Page: https://fous.com/tools/offerup
- Handle: `@offerup`
- Category: [Commerce](https://fous.com/tools/category/commerce)
- Source website: https://offerup.com
- Last verified: Sep 29, 2026

## Methods

### Search listings

Operation `search_listings`, version 1. 1 credit per completed call. Failed calls without a completed billing receipt are free; completed work can remain charged if delivery is interrupted.

Find OfferUp items for sale near a US city or ZIP code, with prices, seller details and links. Distances use approximate listing locations; listings can change or disappear.

**Input**

| Field | Type | Required | Example | Description |
|---|---|---|---|---|
| `sort` | string | no | `"newest"` | Listing order, such as newest. |
| `query` | string | yes | `"table"` | What to search for, such as couch. |
| `location` | string | yes | `"Portland, OR"` | US ZIP code or city and state, such as Seattle, WA or 98101. |
| `condition` | string | no | `"new"` | Item condition, such as used. |
| `max_price` | number | no | `1000` | Maximum price in USD, such as 500. |
| `min_price` | number | no | `100` | Minimum price in USD, such as 100. |
| `max_results` | integer | no | `55` | Maximum listings to return, such as 30. |
| `max_distance_miles` | integer | no | `100` | Maximum distance from the place in miles, such as 20. |

**Input schema**

```json
{
  "type": "object",
  "required": [
    "query",
    "location"
  ],
  "properties": {
    "sort": {
      "enum": [
        "best_match",
        "newest",
        "closest",
        "price_low_to_high",
        "price_high_to_low"
      ],
      "type": "string",
      "default": "best_match",
      "description": "Listing order, such as newest.",
      "examples": [
        "newest",
        "price_low_to_high"
      ]
    },
    "query": {
      "type": "string",
      "minLength": 1,
      "description": "What to search for, such as couch.",
      "examples": [
        "table",
        "iphone",
        "couch"
      ]
    },
    "location": {
      "type": "string",
      "minLength": 1,
      "description": "US ZIP code or city and state, such as Seattle, WA or 98101.",
      "examples": [
        "Portland, OR",
        "98101",
        "Seattle, WA"
      ]
    },
    "condition": {
      "enum": [
        "any",
        "new",
        "open_box",
        "reconditioned",
        "used"
      ],
      "type": "string",
      "default": "any",
      "description": "Item condition, such as used.",
      "examples": [
        "new"
      ]
    },
    "max_price": {
      "type": "number",
      "minimum": 0,
      "description": "Maximum price in USD, such as 500.",
      "examples": [
        1000
      ]
    },
    "min_price": {
      "type": "number",
      "minimum": 0,
      "description": "Minimum price in USD, such as 100.",
      "examples": [
        100
      ]
    },
    "max_results": {
      "type": "integer",
      "default": 30,
      "maximum": 100,
      "minimum": 1,
      "description": "Maximum listings to return, such as 30.",
      "x-fous-developer": true,
      "examples": [
        55,
        5
      ]
    },
    "max_distance_miles": {
      "enum": [
        5,
        10,
        20,
        30,
        50,
        100
      ],
      "type": "integer",
      "default": 30,
      "description": "Maximum distance from the place in miles, such as 20.",
      "examples": [
        100,
        20
      ]
    }
  },
  "additionalProperties": false,
  "examples": [
    {
      "sort": "newest",
      "query": "table",
      "location": "Portland, OR",
      "max_results": 55,
      "max_distance_miles": 100
    },
    {
      "sort": "price_low_to_high",
      "query": "iphone",
      "location": "98101",
      "condition": "new",
      "max_price": 1000,
      "min_price": 100,
      "max_results": 5,
      "max_distance_miles": 20
    },
    {
      "query": "couch",
      "location": "Seattle, WA",
      "max_results": 5
    }
  ]
}
```

**Output**

| Field | Type | Example | Description |
|---|---|---|---|
| `listings` | array |  |  |
| `listings[].city` | string or null | `"Aloha"` |  |
| `listings[].price` | number or null | `50` | Price in USD. |
| `listings[].state` | string or null | `"OR"` |  |
| `listings[].title` | string or null | `"White IKEA console"` |  |
| `listings[].currency` | string | `"USD"` | Price currency code. |
| `listings[].condition` | string or null | `"Used"` |  |
| `listings[].image_link` | string or null | `"https://images.offerup.com/iNlIzS9_YiV20lOVMKb3H7RJCQw=/333x250/3181/318164b209264c1a84beac0445affaf9.jpg"` |  |
| `listings[].listing_id` | string | `"f45fd813-0f41-3505-881c-dc7a4e5813b4"` |  |
| `listings[].seller_name` | string or null | `"John & Liz"` |  |
| `listings[].listing_link` | string | `"https://offerup.com/item/detail/f45fd813-0f41-3505-881c-dc7a4e5813b4"` |  |
| `listings[].distance_miles` | number or null | `9.5` |  |
| `listings[].shipping_available` | boolean | `false` |  |

**Example input**

```json
{
  "sort": "newest",
  "query": "table",
  "location": "Portland, OR",
  "max_results": 55,
  "max_distance_miles": 100
}
```

**Example output**

```json
{
  "listings": [
    {
      "city": "Aloha",
      "price": 50,
      "state": "OR",
      "title": "White IKEA console",
      "currency": "USD",
      "condition": "Used",
      "image_link": "https://images.offerup.com/iNlIzS9_YiV20lOVMKb3H7RJCQw=/333x250/3181/318164b209264c1a84beac0445affaf9.jpg",
      "listing_id": "f45fd813-0f41-3505-881c-dc7a4e5813b4",
      "seller_name": "John & Liz",
      "listing_link": "https://offerup.com/item/detail/f45fd813-0f41-3505-881c-dc7a4e5813b4",
      "distance_miles": 9.5,
      "shipping_available": false
    },
    {
      "city": "Portland",
      "price": 550,
      "state": "OR",
      "title": "Chiropractic Table",
      "currency": "USD",
      "condition": "Used",
      "image_link": "https://images.offerup.com/7oVi01ezd4ZMBLj2U8hvn_vm2po=/250x333/78b8/78b8536c7b9845b590551fa3d25012f5.jpg",
      "listing_id": "7b5f2242-8271-3afd-8d2e-5f810ff05210",
      "seller_name": "Kai Herman",
      "listing_link": "https://offerup.com/item/detail/7b5f2242-8271-3afd-8d2e-5f810ff05210",
      "distance_miles": 3.4,
      "shipping_available": false
    },
    {
      "city": "Aloha",
      "price": 50,
      "state": "OR",
      "title": "Dining set",
      "currency": "USD",
      "condition": "Used",
      "image_link": "https://images.offerup.com/Ma5uvtMK0mmaIClRE1-IqR9Z26Y=/333x250/9693/96938d4feecc45aabe069fd3a5f97685.jpg",
      "listing_id": "a2e2c112-1362-313c-8053-e4ec7ea246b6",
      "seller_name": "John & Liz",
      "listing_link": "https://offerup.com/item/detail/a2e2c112-1362-313c-8053-e4ec7ea246b6",
      "distance_miles": 9.5,
      "shipping_available": false
    }
  ]
}
```

## Quick start

Replace `YOUR_API_KEY` with a Fous API key. To create one, open Developers at the bottom of Fous Studio, turn on Developer mode, then go to API keys (https://app.fous.com/keys). Change the values in `input` to run the same tool on new data.

```bash
curl 'https://api.fous.com/v1/query' \
  --fail-with-body --silent --show-error --max-time 180 \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  --data-raw '{
  "api": "@offerup",
  "visibility": "public",
  "operation": "search_listings",
  "version": 1,
  "input": {
    "sort": "newest",
    "query": "table",
    "location": "Portland, OR",
    "max_results": 55,
    "max_distance_miles": 100
  },
  "response": {
    "format": "json"
  }
}'
```

```python
# Save as fous.py and run with python3 fous.py. No packages needed.
import json
import urllib.error
import urllib.request

api_key = "YOUR_API_KEY"

body = json.loads("{\n  \"api\": \"@offerup\",\n  \"visibility\": \"public\",\n  \"operation\": \"search_listings\",\n  \"version\": 1,\n  \"input\": {\n    \"sort\": \"newest\",\n    \"query\": \"table\",\n    \"location\": \"Portland, OR\",\n    \"max_results\": 55,\n    \"max_distance_miles\": 100\n  },\n  \"response\": {\n    \"format\": \"json\"\n  }\n}")
request = urllib.request.Request(
    "https://api.fous.com/v1/query",
    data=json.dumps(body).encode("utf-8"),
    headers={
        "Authorization": f"Bearer {api_key}",
        "Content-Type": "application/json",
    },
    method="POST",
)
try:
    with urllib.request.urlopen(request, timeout=180) as response:
        result = json.load(response)
except urllib.error.HTTPError as error:
    raise RuntimeError(f"HTTP {error.code}: {error.read().decode('utf-8', errors='replace')}") from error
if result.get("success") is False:
    raise RuntimeError(result.get("error", {}).get("message", "Request failed"))
print(json.dumps(result["data"]["output"], indent=2))
```

```typescript
// Save as fous.mts and run with npx tsx fous.mts.
const apiKey = "YOUR_API_KEY";

const response = await fetch("https://api.fous.com/v1/query", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${apiKey}`,
    "Content-Type": "application/json",
  },
  signal: AbortSignal.timeout(180_000),
  body: JSON.stringify({
  "api": "@offerup",
  "visibility": "public",
  "operation": "search_listings",
  "version": 1,
  "input": {
    "sort": "newest",
    "query": "table",
    "location": "Portland, OR",
    "max_results": 55,
    "max_distance_miles": 100
  },
  "response": {
    "format": "json"
  }
}),
});
type ApiResult = { success: boolean; data?: { output: unknown }; error?: { message: string } };
const result: ApiResult = await response.json();
if (!response.ok || result.success === false) {
  throw new Error(result.error?.message ?? `HTTP ${response.status}`);
}
if (!result.data) throw new Error("Missing API response data");
console.log(result.data.output);
```

## Use from an AI assistant

Connect this tool to Claude Code, Claude Desktop, Cursor, VS Code, Codex and any MCP client as its own MCP server. Each method is a typed tool whose arguments are the method’s input.

- Server URL: `https://api.fous.com/mcp/tools/offerup`
- Authorization: `Authorization: Bearer <Fous API key>`

**Tools**

- `search_listings`: Search listings. 1 credit per completed call. Failed calls without a completed billing receipt are free; completed work can remain charged if delivery is interrupted.
- `fous_get_run`: the result of a run that was still going, by its `request_id`. Free.

Claude Code:

```bash
claude mcp add --scope user --transport http fous-offerup https://api.fous.com/mcp/tools/offerup --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"
```

To give the assistant every tool, connect `https://api.fous.com/mcp`: it finds one with `fous_search_tools` and runs it with `fous_run_tool`. Setup for other clients: https://fous.com/llms-full.txt.

## Use cases

- Find local items within a target price range
- Compare listing prices across nearby sellers
- Identify used goods available in a city
- Review seller details before contacting sellers
- Filter listings by condition and distance

## FAQ

### Can I run it with my own inputs?

Yes. Change the inputs in Studio and press Run, or send new inputs from your code, or ask a connected AI assistant.

### Can I call this OfferUp tool as an API?

Yes. Send a POST request to /v1/query with your Fous API key and the inputs, and get JSON back.

### How much does it cost?

Each completed run costs 1 credit. Failed runs without a completed receipt are free; completed work can remain charged if delivery is interrupted. With pay as you go, a credit costs 1¢. Monthly plans cost less per credit.

### Do I need a OfferUp account?

No. You only need a Fous account.

### How current is the data?

Fous gets the data from offerup.com when you run it. Some results are reused for up to 24 hours, and results that use your account or key are never reused. It was last verified on Sep 29, 2026.

### What listings match a search near a US location?

Search listings returns matching items near the supplied city or ZIP code, with prices, seller details, and links.

### Which listings fall within a price range?

Search listings accepts minimum and maximum prices in USD and returns matching listings.

### How far away are matching listings?

Search listings can filter by maximum distance and returns approximate distances from the supplied location.

## Related

- [eBay API](https://fous.com/tools/ebay.md): eBay provides listings, listing details, seller reputation and newest feedback; shipping varies by destination, and some details or counts may be missing or approximate.
- [Mercari API](https://fous.com/tools/mercari.md): Search secondhand and sold listings on Mercari US.
- [Cars.com API](https://fous.com/tools/cars-com.md): Cars.com finds car listings by make, model, and U.S. ZIP code, and provides dealerships’ latest customer reviews when available.
- [Autotrader API](https://fous.com/tools/autotrader.md): Search new, used and certified cars for sale across the United States.
- [CarGurus API](https://fous.com/tools/cargurus.md): CarGurus helps shoppers browse dealer-listed new and used cars with deal ratings, and view average used prices, price ranges and 12-month price history by model year.
- [Mercado Libre API](https://fous.com/tools/mercado-libre.md): Search public marketplace listings in Latin America.
- [Craigslist API](https://fous.com/tools/craigslist.md): Craigslist offers local ads and searches public listings newest by search order; available listing details omit hidden contacts, and renewals may have older dates.
- [Carfax API](https://fous.com/tools/carfax.md): Carfax provides used-car listings near a US ZIP code with free history highlights, plus open safety recalls reported by CARFAX for a VIN or US plate.
- [All Commerce tools](https://fous.com/tools/category/commerce)
