OfferUp local listings

GET /v1/offerup/listings searches US OfferUp listings around a ZIP code or exact point, with radius, condition, price, category and vehicle filters.

GEThttps://api.soldgraph.com/v1/offerup/listings

Search active OfferUp listings near a place. Give a five-digit zip, or lat and lon for an exact point, plus a radius in miles. One request returns one source page of about 50 listings. Sold search and completed sale prices are not supported; /v1/offerup/sold is not an API endpoint.

displayed_price is the seller's ask in USD. It is not a sale price, and buyers on OfferUp often negotiate. Dealer vehicles can show "call for price", which returns a null price and call_for_price: true.

ParameterTypeDefaultDescription
qstringRequiredSearch keywords, 1–200 characters, as you'd type them into the marketplace's search box. Be specific: model, size, grade, edition.
pageinteger, 1–1001Source page to fetch. Where an endpoint has cursor, pages after 1 also need it.
min_priceinteger, 0–1000000Lowest price, in whole US dollars. Optional. Must not be more than max_price. You can send it without max_price.
max_priceinteger, 0–1000000Highest price, in whole US dollars. Optional. You can send it without min_price.
marketplaceofferupofferupOptional. If sent, it must be offerup.
countryususOnly us is supported.
zipstringFive-digit US ZIP code to search around. Send zip, or both lat and lon. Unknown ZIP codes return 422.
latnumber, 17–72Latitude of the search center in decimal degrees. Use with lon instead of zip for an exact point. Rounded to 4 decimals (about 11 m).
lonnumber, -180–-64Longitude of the search center in decimal degrees. Use with lat.
radius5, 10, 20, 25, 30, 50, 80, 100, 200 or 5000Search radius in miles. Most searches offer 5, 10, 20, 30 or 50. Vehicle searches offer 25, 80, 100, 200 or 5000 (nationwide). If this kind of search doesn't offer your value, we use the widest offered radius below it, or else the smallest offered. result.location.radius_miles shows what was applied. Omit it for the source default: 30, or 80 for vehicles.
categorystringOfferUp category ID, such as 5 (Vehicles), 5.1 (Cars & Trucks) or 1.2 (Cell phones). The endpoint page lists the top-level IDs.
conditionnew, open_box, refurbished, used, for_parts or otherOne condition, or several separated by commas, such as new,open_box. OfferUp labels these differently for vehicles; see the endpoint page.
sortbest_match, newest, nearest, price_asc, price_desc, newest_model or lowest_mileagebest_matchSource ranking, newest posted, nearest, or asking price low to high or high to low. newest_model and lowest_mileage work only on vehicle searches.
vehicle_makeabarth, acura, alfa_romeo, am_general, aston_martin, audi, bentley, bmw, bugatti, buick, cadillac, chevrolet, chrysler, daewoo, daihatsu, datsun, dodge, eagle, ferrari, fiat, fisker, ford, genesis, gmc, honda, hummer, hyundai, infiniti, isuzu, jaguar, jeep, kia, lamborghini, land_rover, lexus, lincoln, lotus, maserati, mazda, mclaren, mercedes_benz, mercury, mini, mitsubishi, nissan, oldsmobile, plymouth, pontiac, porsche, ram, rolls_royce, saab, saturn, scion, smart, subaru, suzuki, tesla, toyota, volkswagen or volvoVehicle searches only. One make, or several separated by commas, such as honda,toyota.
vehicle_max_mileage0, 25000, 50000, 75000, 100000, 125000, 150000, 175000 or 200000Vehicle searches only. Highest odometer reading.
vehicle_stylecar, suv, truck or vanVehicle searches only. One body style, or several separated by commas.
vehicle_transmissionautomatic or manualVehicle searches only.
vehicle_drivetrainawd, fwd or rwdVehicle searches only. One drivetrain, or several separated by commas.
cursorstringPrevious page's next_cursor. Omit it on page 1. Keep every other parameter unchanged.
curl -G https://api.soldgraph.com/v1/offerup/listings \  -H "Authorization: Bearer $SOLDGRAPH_KEY" \  --data-urlencode "q=mountain bike" \  -d zip=94103 \  -d radius=10 \  -d max_price=800

A cache miss returns 202 with a job to poll. Successful searches cost one credit, including cached results. Failed searches are free. Results are cached for 15 minutes. See search jobs.

#Location and radius

  • zip uses the US Census center point of that ZIP code. A ZIP code with no Census area, such as a PO-box-only ZIP, returns 422. Use lat and lon instead.
  • lat and lon give the most precise center. They are rounded to 4 decimals, about 11 meters.
  • Most searches offer 5, 10, 20, 30 or 50 miles; 50 is OfferUp's maximum. Car and truck searches offer 25, 80, 100, 200 or 5000 miles; 5000 means nationwide.
  • If your radius isn't offered for the kind of search, we use the widest offered radius below it, or else the smallest offered. For example, 30 miles on a car search becomes 25. result.location.radius_miles always shows the radius applied.
  • When nearby results run out, OfferUp can widen the area on later pages. result.location.widened_radius_miles shows when that happened. Use the item endpoint's coordinates if you need a strict distance check.
  • location_text is the area the seller chose, such as Oakland, CA. It is not an address.

#Filters

  • condition takes one or more of new, open_box, refurbished, used, for_parts and other, separated by commas.
  • min_price and max_price are whole US dollars. Either can be sent alone.
  • sort takes best_match, newest, nearest, price_asc or price_desc.
  • category takes an OfferUp category ID. Top-level IDs: 1 Electronics & Media, 2 Home & Garden, 3 Clothing, Shoes & Accessories, 4 Baby & Kids, 5 Vehicles, 6 Toys, Games & Hobbies, 7 Sports & Outdoors, 8 Collectibles & Art, 9 Pet supplies, 10 Health & Beauty, 11 Wedding, 12 Business equipment, 13 Tickets, 14 General. Second-level IDs look like 5.1 (Cars & Trucks) or 5.2 (Motorcycles); the item endpoint returns each listing's full category ID.
  • If OfferUp doesn't apply a filter you sent, the search fails with filter_not_supported and costs nothing. We never return unfiltered results as if they were filtered.

#Cars and trucks

OfferUp treats some searches as cars and trucks, either from category=5.1 or from the keywords, such as honda civic. Then result.vehicle_search is true and result.category_id is 5.1. Only these searches accept:

  • vehicle_make: one or more makes, such as honda,toyota.
  • vehicle_max_mileage: 0, 25000, 50000 and so on up to 200000.
  • vehicle_style: car, suv, truck or van.
  • vehicle_transmission: automatic or manual.
  • vehicle_drivetrain: awd, fwd or rwd.
  • sort=newest_model or sort=lowest_mileage.

OfferUp labels conditions differently for cars: new is New, refurbished is Excellent, open_box is Very good, used is Good, for_parts is Fair and other is For parts.

#Pages

Start with page=1 and no cursor. For the next page, send the returned next_cursor and next_page, keeping every other parameter the same. Mismatched pagination returns 422.

OfferUp repeats listings across pages. We remove repeats: count is the number of new listings on this page, and page_size is the number of source rows. Paging ends when next_page is null. That happens when the source has no more pages, when a page brings fewer than 5 new listings, or after about 220 listings in one search. For more coverage, run narrower searches, such as a smaller radius, several ZIP codes or tighter filters.

promoted marks paid placements that OfferUp mixes into results. reported_total is always null.

Use Next page in the Playground to handle cursors automatically.

#Example response

These listings were collected on October 1, 2026 (UTC). Prices and availability change.

Response
{  "request_id": "example-offerup-search",  "status": "complete",  "credits": 1,  "cached": false,  "result": {    "provider": "offerup",    "country": "us",    "query": "mountain bike",    "page": 1,    "page_size": 3,    "count": 3,    "reported_total": null,    "next_page": 2,    "next_cursor": "eNoti8tygjAAAP8lV2EMISniTVCBQW0JiErtIYQg1gdPW8Dx38uhx53d_XyCWrCKZ76o63N-dxIwBfXAcIKwrkyYLHisyZiQNzlGKJVZikSCFExiiID0Py-FSMxHVefVcD-PIE_TWjRHMMX6a4jSQfsNqxowJfAlAazERGUJwTHXWMJ1ICFJgRIwhOoakyIxuYnNPPTn7owvbn5vlb1ul23ouFbkUHT4yMrAM9a6t6MOfRBGUXj1i5oEsc23lM92y_56MMdZ5Owv0a6popGqsTK4icLoTosKfo_0_dXU3nOKosKgUWlpYenP1apbnRpoKD9ktPntrHXrbN2WbKLOaPQubWH3OIT9ylIhHnvK_RIg2z6rSnwjPm01grJxAB3w9QeCVWr5",    "collected_at": "2026-10-01T15:19:15.793154+00:00",    "schema_version": 1,    "completeness": "provider_page_only",    "location": {      "zip": "94103",      "latitude": 37.773,      "longitude": -122.4113,      "radius_miles": 10,      "requested_radius_miles": 10,      "widened_radius_miles": null    },    "category_id": null,    "vehicle_search": false,    "field_notes": "Active local listings around the requested point. Prices are seller asks in USD, not sale prices; vehicle listings may say call for price. location_text is the seller-chosen area, not an address. Promoted rows are paid placements that OfferUp mixes into results. One source page, not complete coverage; ranking can repeat a listing across pages. Use the item endpoint for posted date, coordinates, seller and shipping details. No sold search or final sale prices are provided.",    "data": [      {        "id": "0f979dba-51bf-355c-851f-bfce6924a6e2",        "title": "Red Mountain Bike with Rear Derailleur",        "link": "https://offerup.com/item/detail/0f979dba-51bf-355c-851f-bfce6924a6e2",        "displayed_price": {          "amount": 55,          "currency": "USD"        },        "displayed_price_text": "$55.00",        "call_for_price": false,        "firm_price": null,        "condition": null,        "location_text": "Colma, CA",        "city": "Colma",        "state": "CA",        "image": "https://images.offerup.com/6rToWFKBLNOWCjZi6vygVhr5RhY=/250x333/2bb8/2bb8802d7a6a40239227dcecc7dc00f8.jpg",        "vehicle_miles": null,        "promoted": false,        "flags": [          "LOCAL_PICKUP"        ]      },      {        "id": "576dd673-e4e8-32a4-be4d-ed3082be7dc0",        "title": "29” rims and tires",        "link": "https://offerup.com/item/detail/576dd673-e4e8-32a4-be4d-ed3082be7dc0",        "displayed_price": {          "amount": 200,          "currency": "USD"        },        "displayed_price_text": "$200.00",        "call_for_price": false,        "firm_price": null,        "condition": null,        "location_text": "San Francisco, CA",        "city": "San Francisco",        "state": "CA",        "image": "https://images.offerup.com/aw7JbLs49mAW48NiCdjwWTVdEos=/250x333/92d5/92d5cb78f2684da4928f6ab1acfae32b.jpg",        "vehicle_miles": null,        "promoted": false,        "flags": [          "LOCAL_PICKUP"        ]      },      {        "id": "c3fa0772-44bf-3e75-82d4-6b2e485fed34",        "title": "Bicicleta  Specialized",        "link": "https://offerup.com/item/detail/c3fa0772-44bf-3e75-82d4-6b2e485fed34",        "displayed_price": {          "amount": 750,          "currency": "USD"        },        "displayed_price_text": "$750.00",        "call_for_price": false,        "firm_price": null,        "condition": null,        "location_text": "San Francisco, CA",        "city": "San Francisco",        "state": "CA",        "image": "https://images.offerup.com/TKsyB4L-9DolRgxZgDrj0cd1Hg0=/250x444/50a7/50a795009b2b42dfa83eeec180748dc0.jpg",        "vehicle_miles": null,        "promoted": false,        "flags": [          "LOCAL_PICKUP"        ]      }    ]  }}
FieldTypeDescription
request_idstringID of this request. Poll it at /v1/jobs/{request_id}.
statusstringpending, complete or failed. Always check it, even on HTTP 200.
creditsintegerRequests charged: 1 when complete, 0 while pending or when failed.
cachedbooleanTrue when the result came from the 15-minute cache.
poll_urlstringOnly while pending. A path like /v1/jobs/{id}: join it to https://api.soldgraph.com, not to the /v1 base URL.
error.codestringOnly when failed. See failed job codes.
resultobjectOnly when complete. One source page from the marketplace.
result.providerstringMarketplace ID, like ebay or poshmark.
result.countrystringAlways us.
result.querystringThe q you sent, with extra spaces removed.
result.pageintegerThe page you asked for.
result.countintegerRows in result.data on this page.
result.reported_totalintegerTotal matches the marketplace reports for the search. It may be rounded or capped.
result.next_pageinteger | nullSend this as page to get the next page. Null on the last page, and on page 100, the deepest page served.
result.collected_atstringWhen we collected the page, as an ISO 8601 timestamp.
result.schema_versionintegerVersion of this response shape. Currently 2.
result.completenessstringAlways provider_page_only: one page, not a full sales history.
result.field_notesstringPlain-text notes on how to read this page's fields.
result.locationobjectThe search center as zip, latitude and longitude. Also radius_miles (applied), requested_radius_miles, and widened_radius_miles: the wider area OfferUp used for this page because nearby results ran out, else null.
result.vehicle_searchbooleanTrue when OfferUp treated the search as cars and trucks. Vehicle radius options, filters and sorts apply only then.
result.category_idstring | nullCategory OfferUp applied, including one it picked from the keywords, such as 5.1 for "honda civic".
result.page_sizeintegerListing rows on the source page, including repeats from earlier pages.
result.countintegerRows returned: the page minus listings already returned on earlier pages of this search.
result.next_cursorstring | nullSend as cursor with page=next_page. Null at the end, when a page is mostly repeats, or after about 220 listings.
result.reported_totalnullAlways null: OfferUp does not report a total.
result.data[].idstringOfferUp listing ID. Pass it to /v1/offerup/item for full details.
result.data[].titlestringSeller title, up to 2,000 characters.
result.data[].linkstringPublic OfferUp listing URL.
result.data[].displayed_priceobject | nullUSD asking price as { amount, currency }. Null when the seller asks buyers to call. Never a sale price.
result.data[].displayed_price_textstring | nullFormatted USD asking price.
result.data[].call_for_pricebooleanThe listing shows "call for price", mostly dealer vehicles.
result.data[].firm_priceboolean | nullThe seller marked the price firm, when the source says.
result.data[].conditionstring | nullCondition label when search shows one. Usually null; the item endpoint always has condition.
result.data[].location_textstring | nullSeller-chosen area, such as Oakland, CA. Not an address.
result.data[].citystring | nullCity from location_text when it reads "City, ST".
result.data[].statestring | nullTwo-letter state from location_text.
result.data[].imageobject | nullThumbnail URL on the OfferUp image CDN.
result.data[].vehicle_milesinteger | nullOdometer reading shown on vehicle listings.
result.data[].promotedbooleanA paid placement OfferUp mixed into the results.
result.data[].flagsstring[]Raw source flags, such as LOCAL_PICKUP or CALL_FOR_PRICE.
Try it
Request
curl -G https://api.soldgraph.com/v1/offerup/listings \  -H "Authorization: Bearer $SOLDGRAPH_KEY" \  --data-urlencode "q=mountain bike" \  -d max_price=800 \  -d zip=94103 \  -d radius=10
Sign in to runFree account, no card.