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.
https://api.soldgraph.com/v1/offerup/listingsSearch 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.
| Parameter | Type | Default | Description |
|---|---|---|---|
q | string | Required | Search keywords, 1–200 characters, as you'd type them into the marketplace's search box. Be specific: model, size, grade, edition. |
page | integer, 1–100 | 1 | Source page to fetch. Where an endpoint has cursor, pages after 1 also need it. |
min_price | integer, 0–1000000 | Lowest price, in whole US dollars. Optional. Must not be more than max_price. You can send it without max_price. | |
max_price | integer, 0–1000000 | Highest price, in whole US dollars. Optional. You can send it without min_price. | |
marketplace | offerup | offerup | Optional. If sent, it must be offerup. |
country | us | us | Only us is supported. |
zip | string | Five-digit US ZIP code to search around. Send zip, or both lat and lon. Unknown ZIP codes return 422. | |
lat | number, 17–72 | Latitude of the search center in decimal degrees. Use with lon instead of zip for an exact point. Rounded to 4 decimals (about 11 m). | |
lon | number, -180–-64 | Longitude of the search center in decimal degrees. Use with lat. | |
radius | 5, 10, 20, 25, 30, 50, 80, 100, 200 or 5000 | Search 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. | |
category | string | OfferUp category ID, such as 5 (Vehicles), 5.1 (Cars & Trucks) or 1.2 (Cell phones). The endpoint page lists the top-level IDs. | |
condition | new, open_box, refurbished, used, for_parts or other | One condition, or several separated by commas, such as new,open_box. OfferUp labels these differently for vehicles; see the endpoint page. | |
sort | best_match, newest, nearest, price_asc, price_desc, newest_model or lowest_mileage | best_match | Source 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_make | abarth, 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 volvo | Vehicle searches only. One make, or several separated by commas, such as honda,toyota. | |
vehicle_max_mileage | 0, 25000, 50000, 75000, 100000, 125000, 150000, 175000 or 200000 | Vehicle searches only. Highest odometer reading. | |
vehicle_style | car, suv, truck or van | Vehicle searches only. One body style, or several separated by commas. | |
vehicle_transmission | automatic or manual | Vehicle searches only. | |
vehicle_drivetrain | awd, fwd or rwd | Vehicle searches only. One drivetrain, or several separated by commas. | |
cursor | string | Previous 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=800A 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
zipuses the US Census center point of that ZIP code. A ZIP code with no Census area, such as a PO-box-only ZIP, returns422. Uselatandloninstead.latandlongive 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_milesalways shows the radius applied. - When nearby results run out, OfferUp can widen the area on later pages.
result.location.widened_radius_milesshows when that happened. Use the item endpoint's coordinates if you need a strict distance check. location_textis the area the seller chose, such asOakland, CA. It is not an address.
#Filters
conditiontakes one or more ofnew,open_box,refurbished,used,for_partsandother, separated by commas.min_priceandmax_priceare whole US dollars. Either can be sent alone.sorttakesbest_match,newest,nearest,price_ascorprice_desc.categorytakes an OfferUp category ID. Top-level IDs:1Electronics & Media,2Home & Garden,3Clothing, Shoes & Accessories,4Baby & Kids,5Vehicles,6Toys, Games & Hobbies,7Sports & Outdoors,8Collectibles & Art,9Pet supplies,10Health & Beauty,11Wedding,12Business equipment,13Tickets,14General. Second-level IDs look like5.1(Cars & Trucks) or5.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_supportedand 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 ashonda,toyota.vehicle_max_mileage: 0, 25000, 50000 and so on up to 200000.vehicle_style:car,suv,truckorvan.vehicle_transmission:automaticormanual.vehicle_drivetrain:awd,fwdorrwd.sort=newest_modelorsort=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.
{ "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" ] } ] }}| Field | Type | Description |
|---|---|---|
request_id | string | ID of this request. Poll it at /v1/jobs/{request_id}. |
status | string | pending, complete or failed. Always check it, even on HTTP 200. |
credits | integer | Requests charged: 1 when complete, 0 while pending or when failed. |
cached | boolean | True when the result came from the 15-minute cache. |
poll_url | string | Only while pending. A path like /v1/jobs/{id}: join it to https://api.soldgraph.com, not to the /v1 base URL. |
error.code | string | Only when failed. See failed job codes. |
result | object | Only when complete. One source page from the marketplace. |
result.provider | string | Marketplace ID, like ebay or poshmark. |
result.country | string | Always us. |
result.query | string | The q you sent, with extra spaces removed. |
result.page | integer | The page you asked for. |
result.count | integer | Rows in result.data on this page. |
result.reported_total | integer | Total matches the marketplace reports for the search. It may be rounded or capped. |
result.next_page | integer | null | Send this as page to get the next page. Null on the last page, and on page 100, the deepest page served. |
result.collected_at | string | When we collected the page, as an ISO 8601 timestamp. |
result.schema_version | integer | Version of this response shape. Currently 2. |
result.completeness | string | Always provider_page_only: one page, not a full sales history. |
result.field_notes | string | Plain-text notes on how to read this page's fields. |
result.location | object | The 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_search | boolean | True when OfferUp treated the search as cars and trucks. Vehicle radius options, filters and sorts apply only then. |
result.category_id | string | null | Category OfferUp applied, including one it picked from the keywords, such as 5.1 for "honda civic". |
result.page_size | integer | Listing rows on the source page, including repeats from earlier pages. |
result.count | integer | Rows returned: the page minus listings already returned on earlier pages of this search. |
result.next_cursor | string | null | Send as cursor with page=next_page. Null at the end, when a page is mostly repeats, or after about 220 listings. |
result.reported_total | null | Always null: OfferUp does not report a total. |
result.data[].id | string | OfferUp listing ID. Pass it to /v1/offerup/item for full details. |
result.data[].title | string | Seller title, up to 2,000 characters. |
result.data[].link | string | Public OfferUp listing URL. |
result.data[].displayed_price | object | null | USD asking price as { amount, currency }. Null when the seller asks buyers to call. Never a sale price. |
result.data[].displayed_price_text | string | null | Formatted USD asking price. |
result.data[].call_for_price | boolean | The listing shows "call for price", mostly dealer vehicles. |
result.data[].firm_price | boolean | null | The seller marked the price firm, when the source says. |
result.data[].condition | string | null | Condition label when search shows one. Usually null; the item endpoint always has condition. |
result.data[].location_text | string | null | Seller-chosen area, such as Oakland, CA. Not an address. |
result.data[].city | string | null | City from location_text when it reads "City, ST". |
result.data[].state | string | null | Two-letter state from location_text. |
result.data[].image | object | null | Thumbnail URL on the OfferUp image CDN. |
result.data[].vehicle_miles | integer | null | Odometer reading shown on vehicle listings. |
result.data[].promoted | boolean | A paid placement OfferUp mixed into the results. |
result.data[].flags | string[] | Raw source flags, such as LOCAL_PICKUP or CALL_FOR_PRICE. |