eBay active listings
GET /v1/ebay/listings searches one page of eBay US active listings by keyword, with condition, price and sort options, and returns JSON.
GET
https://api.soldgraph.com/v1/ebay/listingsSearch eBay US active listings by keyword. Each call returns one page, in the order you pick with sort. Promoted listings are included, and promoted flags them.
Coming from the eBay Browse API? See eBay Browse API vs Soldgraph.
| 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. On Poshmark, Mercari and Depop, pages after 1 also need cursor. |
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 | ebay | ebay | Optional. If sent, it must be ebay. |
country | us | us | Only us is supported. |
sort | best_match, newest, price_asc or ending_soon | best_match | eBay's listing order. Promoted listings are included and flagged. |
condition | One or more of new, open_box, refurbished, used, for_parts, comma-separated | eBay's own condition groups. Send one or more, separated by commas, like new,open_box. new is Brand New, open_box is Open Box or New (Other), refurbished is every refurbished grade, used is Pre-Owned and for_parts is Parts Only. eBay applies the filter. |
curl -G https://api.soldgraph.com/v1/ebay/listings \ -H "Authorization: Bearer $SOLDGRAPH_KEY" \ --data-urlencode "q=canon ae-1 program" \ -d page=1The first call usually returns 202 and a job to poll. Search jobs covers polling, retries and pagination.
#Filters
conditiontakes one or more of eBay's condition groups, separated by commas, likenew,open_box. The groups arenew(Brand New),open_box(Open Box or New (Other)),refurbished(every refurbished grade),used(Pre-Owned) andfor_parts(Parts Only).min_priceandmax_priceare whole US dollars. You can send either one alone.
eBay applies the filters, so reported_total counts only matching listings.
#Example response
Response
{ "request_id": "00000000-0000-4000-8000-000000000001", "status": "complete", "credits": 1, "cached": false, "result": { "provider": "ebay", "country": "us", "query": "canon ae-1 program", "page": 1, "page_size": 40, "count": 1, "reported_total": 1, "next_page": null, "next_cursor": null, "collected_at": "2026-09-23T14:02:11Z", "schema_version": 1, "completeness": "provider_page_only", "data": [ { "id": "123456789012", "title": "Example eBay listing", "link": "https://www.ebay.com/itm/123456789012", "promoted": false, "format": "fixed_price", "displayed_price": { "amount": 189, "currency": "USD" }, "displayed_price_text": "$189.00", "displayed_shipping": { "amount": 0, "currency": "USD" }, "shipping_text": "Free delivery", "condition": "Pre-Owned", "brand": null, "size": null, "listed_at": null, "bid_count": null, "ends_at": null, "best_offer": false, "seller_text": "filmcamerashop (1,204) 100%", "location_text": null, "image": "https://i.ebayimg.com/images/g/example/s-l500.jpg" } ], "field_notes": "Listings are in the marketplace's order; promoted listings are included and flagged. Unverified fields are null." }}| 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. |
result.collected_at | string | When we collected the page, as an ISO 8601 timestamp. |
result.schema_version | integer | Version of this response shape. Currently 1. |
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.page_size | integer | Rows per page, as eBay reports it. |
result.data[].id | string | The marketplace's listing ID. |
result.data[].title | string | null | Listing title as shown. |
result.data[].link | string | URL of the listing on the marketplace. |
result.data[].promoted | boolean | True for a sponsored placement. |
result.data[].format | string | auction when the listing shows bids or an end time, otherwise fixed_price. |
result.data[].displayed_price | object | null | { amount, currency } parsed from the price shown: the asking price or current bid. Null if it couldn't be read. Null when eBay shows a price range for a multi-variation listing ("$247.00 to $911.00"): the amount wouldn't say which variant. The range stays in displayed_price_text. |
result.data[].displayed_price_text | string | null | The price text as shown, like $189.00. |
result.data[].displayed_shipping | object | null | { amount, currency } read from exact shipping text, like +$9.99 delivery. Free delivery is 0. Estimates and Shipping not specified are null. |
result.data[].shipping_text | string | null | Shipping text as shown, like +$9.99 delivery or Free delivery. |
result.data[].condition | string | null | eBay's condition text as shown, like Pre-Owned. |
result.data[].brand | null | Always null on eBay. |
result.data[].size | null | Always null on eBay. |
result.data[].listed_at | null | Always null on eBay. |
result.data[].bid_count | integer | null | Number of bids, for auctions. |
result.data[].ends_at | string | null | Auction end time, ISO 8601 UTC. |
result.data[].best_offer | boolean | True when the seller accepts Best Offers. |
result.data[].seller_text | string | null | Seller text as eBay shows it: username, feedback count and positive percentage, e.g. clutch_supply (1,325) 99.7%. |
result.data[].location_text | string | null | Item location text as shown. |
result.data[].image | string | null | Image URL on i.ebayimg.com. |
displayed_price is the asking price or current bid that eBay shows. Fields we can't read are null.
displayed_shippingis read only from exact text like+$9.99 delivery.Free deliveryis 0. Estimates andShipping not specifiedare null.conditionis eBay's own text, likePre-Owned.brand,sizeandlisted_atare always null on eBay. They exist so rows have the same fields on every marketplace.
Try it