eBay Sold Item Details API
The eBay sold item details API is GET /ebay/v1/item: pass the item_id of any sold listing and get the listing page in full, every item specific, the description, all images, the seller, shipping and returns, and the sales recorded for it.
Returns the page-level data of one sold listing: every item specific, the description, all images, the seller, shipping service and returns policy, plus the listing's recorded sales.
Cost. 1 credit when the details are returned.
Removed listings. When eBay has taken the listing down, the response is a 200 that carries only site, item_id, listing_state set to removed and credits_charged set to 0. That answer is final; check listing_state before reading any other field.
Details not available yet. A listing's details become available a few minutes after its sale is recorded. Until then the response is 404, which is not charged; request the item again later.
Reading the sale. Every item_id returned by the sold-listings search has sold at least once. listing_state reports what the listing showed when its details were recorded, so active and ended_unsold do not mean the item is unsold: on those, sold_at, sale_price and best_offer_accepted are null, and the dates and prices of the sales are in sales.
Request
https://api.trawl.dev/ebay/v1/item Send the API key in the x-api-key header. The samples read it from the TRAWL_API_KEY environment variable.
Parameters
| Parameter | Type | Description |
|---|---|---|
item_idrequired | string | The numeric eBay item id of the listing, 9 to 15 digits. It is the item_id of any sold-listings search result. |
site | EBAY_US | EBAY_GB | The marketplace the item sold on. The value is case-insensitive. |
Call it
curl "https://api.trawl.dev/ebay/v1/item?item_id=256637082114" \
-H "x-api-key: $TRAWL_API_KEY"from trawl_api import Trawl
client = Trawl() # reads TRAWL_API_KEY
item = client.ebay.item("256637082114")import { Trawl } from 'trawl-api'
const client = new Trawl() // reads TRAWL_API_KEY
const item = await client.ebay.item('256637082114')Response
The listing's details, or the statement that eBay has removed the listing.
Fields
| Field | Type | Description |
|---|---|---|
site | EBAY_US | EBAY_GB | The marketplace the listing belongs to. |
item_id | string | The eBay item id of the listing. |
title | string | null | The listing title. |
condition | new | used | parts | other | The normalized condition, derived from the condition shown on the listing page. |
condition_raw | string | null | The condition as the listing page words it, verbatim. For trading cards and coins this is the full line, for example Graded - PSA 10 or Ungraded - Near mint or better. null when the page showed none. |
condition_description | string | null | The seller's own note about the item's condition. |
grading | object | null | The grading of a trading card or coin, split out of condition_raw. null for every other kind of item. |
grading.graded | boolean | true for a professionally graded item (a slab), false for an ungraded one. |
grading.grader | string | null | The grading company as eBay abbreviates it, for example PSA, CGC or BGS. Set on graded items only. When the condition line does not end in a recognizable grade, its whole remainder is placed here and grade is null. |
grading.grade | string | null | The grade as printed, for example 10, 9.5 or Authentic. Set on graded items only. |
grading.condition | string | null | The seller-declared condition of an ungraded item, for example Near mint or better, or Uncirculated for a coin. null on graded items. |
listing_state | sold | active | ended_unsold | null | What the listing page showed when its details were recorded. sold means the page showed the sale. active means the listing was still live, usually a multi-quantity listing with stock left or a relisted item. ended_unsold means the listing had ended without the page showing a sale. In all three cases the item has sold at least once, and the sales are in sales. |
sold_at | date-time | null | The instant the listing sold, in UTC, as shown on the listing page. null unless listing_state is sold; use sales[].date_sold otherwise. |
last_updated | date-time | null | When the seller last revised the listing, as shown on the listing page. |
sale_price | number | null | The price the item sold for, as shown on the listing page, in the page's currency. null unless listing_state is sold; use sales[].sale_price otherwise. When best_offer_accepted is true this is the accepted offer amount on categories where eBay publishes it, and the listed price elsewhere. On EBAY_GB, for a listing priced in pounds whose sale did not close on an accepted offer, this is the price of the recorded sale, so it agrees with the sold-listings search. |
currency | string | null | The currency of sale_price as the listing page prints it, for example US$ or £. |
buying_format | string | null | How the item was sold, as eBay labels it, for example Buy It Now or Auction. |
bids | integer | null | The number of bids on an auction. null for fixed-price listings. |
best_offer_available | boolean | null | Whether the listing accepted Best Offers. |
best_offer_accepted | boolean | null | Whether the sale closed on an accepted Best Offer. null unless listing_state is sold. |
shipping_service | string | null | The shipping service named on the listing page, for example USPS Ground Advantage. The shipping cost the buyer paid is shipping_price on each entry of sales. |
returns_text | string | null | The returns policy as worded on the listing page. |
seller_accepts_returns | boolean | null | Whether the seller accepts returns. |
location | string | null | The item's location as shown on the listing page, for example Austin, Texas. |
location_country | string | null | The country part of the item's location. |
epid | string | null | The eBay product id (ePID) of the catalog product the listing is matched to. null when the listing has none. |
categoryId | string | null | The id of the leaf category the listing is in. |
item_link | url | The URL of the listing on eBay. |
images | url[] | The URLs of every image on the listing page, in page order. Empty when there are none. |
attributes | object[] | The listing's item specifics, in page order. Empty when there are none. |
attributes[].key | string | The name of the item specific as the seller's listing shows it, for example Brand or Storage Capacity. |
attributes[].value | string | The value as displayed on the listing page. When the seller gave several values this is the joined display string, for example Magnet, PP, Rubber. |
attributes[].values | string[] | Every value given for this item specific, one entry each. |
description_url | url | null | The URL of the listing's description document on eBay. |
description_text | string | null | The listing description as plain text. |
seller | object | null | The seller of the listing. null when the page showed no seller. |
seller.username | string | The seller's eBay username. |
seller.feedback_percent | number | null | The seller's positive-feedback percentage, from 0 to 100. |
seller.feedback_count | integer | null | The seller's feedback count. |
seller.items_sold | integer | null | The number of items the seller has sold, when the listing page shows it. |
feedback | object[] | Recent feedback left for the seller, as shown on the listing page. Empty when there is none. |
feedback[].username | string | null | The buyer's username, masked as eBay shows it, for example b***y. |
feedback[].rating | string | null | The kind of feedback, one of positive, neutral or negative. |
feedback[].comment | string | null | The text of the feedback. |
feedback[].age_text | string | null | How long ago the feedback was left, as eBay words it, for example Past month. |
sales | object[] | The recorded sales of this listing, newest first, at most 100. A listing that sold on several days has one entry per sale. These are the dates and prices to use when listing_state is not sold. |
sales[].date_sold | date-time | The day of the sale on the marketplace's own calendar, written as a timestamp. The trailing Z is nominal. |
sales[].sale_price | number | The price of this sale as eBay's sold results report it, in the marketplace's currency. For a sale that closed on an accepted Best Offer this is the listed price; the accepted amount, where eBay publishes it, is the top-level sale_price with best_offer_accepted true. |
sales[].shipping_price | number | null | The shipping cost the buyer paid for this sale. 0 for free shipping. |
sales[].currency | string | null | The currency symbol of this sale's prices, for example $ or £. |
sales[].condition | string | null | eBay's wording for the condition at the time of this sale, for example Pre-Owned. |
credits_charged | integer | Credits this response cost. Always 1 when details are returned. |
Examples
{
"site": "EBAY_US",
"item_id": "256637082114",
"title": "Apple iPhone 15 Pro 256GB Natural Titanium Unlocked A2848",
"condition": "used",
"condition_raw": "Pre-Owned",
"condition_description": "Light scratches on the frame, screen flawless. Battery health 91%.",
"grading": null,
"listing_state": "sold",
"sold_at": "2026-09-28T21:32:00.000Z",
"last_updated": "2026-09-26T18:04:11.000Z",
"sale_price": 548,
"currency": "US$",
"buying_format": "Buy It Now",
"bids": null,
"best_offer_available": true,
"best_offer_accepted": false,
"shipping_service": "USPS Ground Advantage",
"returns_text": "30 days returns. Buyer pays for return shipping.",
"seller_accepts_returns": true,
"location": "Austin, Texas",
"location_country": "United States",
"epid": "13062762640",
"categoryId": "9355",
"item_link": "https://www.ebay.com/itm/256637082114",
"images": [
"https://i.ebayimg.com/images/g/k3YAAOSwq1JlXvRt/s-l1600.webp",
"https://i.ebayimg.com/images/g/m~sAAOSwq1JlXvRu/s-l1600.webp"
],
"attributes": [
{
"key": "Brand",
"value": "Apple",
"values": [
"Apple"
]
},
{
"key": "Model",
"value": "Apple iPhone 15 Pro",
"values": [
"Apple iPhone 15 Pro"
]
},
{
"key": "Storage Capacity",
"value": "256 GB",
"values": [
"256 GB"
]
},
{
"key": "Network",
"value": "Unlocked",
"values": [
"Unlocked"
]
}
],
"description_url": "https://itm.ebaydesc.com/itmdesc/256637082114",
"description_text": "Fully unlocked iPhone 15 Pro, 256GB, Natural Titanium. Battery health 91%. Comes with the original box and an unused cable.",
"seller": {
"username": "phone-depot",
"feedback_percent": 99.6,
"feedback_count": 6864,
"items_sold": 12480
},
"feedback": [
{
"username": "b***y",
"rating": "positive",
"comment": "Exactly as described, fast shipping",
"age_text": "Past month"
}
],
"sales": [
{
"date_sold": "2026-09-28T00:00:00.000Z",
"sale_price": 548,
"shipping_price": 0,
"currency": "$",
"condition": "Pre-Owned"
}
],
"credits_charged": 1
}{
"site": "EBAY_US",
"item_id": "318172191585",
"listing_state": "removed",
"credits_charged": 0
}Errors
Every error is a JSON object with one error string and is not charged. The statuses this endpoint answers with:
| Status | Meaning |
|---|---|
| 400 | A parameter failed validation. The message names the parameter and the rule it broke. Not charged. |
| 403 | The x-api-key header is missing, or the key is invalid, revoked or belongs to a closed account. Rate-limit headers are not sent on this response. |
| 404 | The listing's details are not available yet. They usually follow within minutes of a sale; request the item again later. Not charged. |
| 429 | The request was refused and not charged. There are two cases, told apart by the Retry-After header. With Retry-After, the account's per-second rate was exceeded: wait that many seconds and retry. Without it, the account's monthly credits are spent, or too few remain to cover the most the request could cost: lower max_pages, wait for the time in X-RateLimit-Reset, or change plan. Retrying without one of those does not help. |
| 500 | An internal error. Not charged. |
| 503 | The service is temporarily unavailable, or the request took longer than 30 seconds. Not charged. Safe to retry with backoff. |