Accepted Best Offer Prices API
Get the price the buyer actually paid on eBay Best Offer sales with bestOfferPrice=true on /v1/scrape, at no extra cost, on every CompSniper plan.
On an eBay sale that ended with an accepted Best Offer, the sold page shows the listing price, not the
price the buyer paid. Add bestOfferPrice=true to a sold search and CompSniper returns the real accepted
price on those rows as acceptedOfferPrice. It is available on every plan, including free, and costs
nothing extra: the search is still billed as one request.
In a test on October 11, 2026 across 177 Pokemon card Best Offer sales, the accepted price was found for 77% of them, and every accepted price was at or below the listing price shown on eBay.
Make a request
curl --fail-with-body \
-H "Authorization: Bearer cs_live_REPLACEWITHYOURKEY" \
"https://api.compsniper.com/v1/scrape?keyword=charizard+ex+199%2F165+psa+10&count=60&bestOfferPrice=true"import requests
response = requests.get(
"https://api.compsniper.com/v1/scrape",
headers={"Authorization": "Bearer cs_live_REPLACEWITHYOURKEY"},
params={"keyword": "charizard ex 199/165 psa 10", "count": 60, "bestOfferPrice": "true"},
timeout=120,
)
response.raise_for_status()
for item in response.json()["items"]:
if item["bestOfferAccepted"]:
print(item["itemId"], item["soldPrice"], item["acceptedOfferPrice"], item["acceptedOfferPriceStatus"])Response fields
Rows where bestOfferAccepted is true gain two fields. Every other row is unchanged.
{
"itemId": "389012345678",
"title": "Pokemon Charizard ex 199/165 SIR PSA 10",
"bestOfferAccepted": true,
"soldPrice": "450.00",
"soldCurrency": "USD",
"acceptedOfferPrice": "405.00",
"acceptedOfferPriceStatus": "found"
}| Field | Meaning |
|---|---|
acceptedOfferPrice | The price the buyer actually paid, as a string in the sale currency. null unless the status is found. |
acceptedOfferPriceStatus | found, pending or not_available (see below). |
soldPrice is never changed. It stays the price eBay shows on the sold listing, so your existing code
keeps working, and you can compare the two prices to see the discount the seller accepted.
Status values
| Status | Meaning |
|---|---|
found | The accepted price is in acceptedOfferPrice. Found prices are final. |
pending | Not found yet. CompSniper keeps checking in the background for up to 5 days. Look it up again later with the free lookup below. |
not_available | No accepted price will be returned for this sale, for example when it was still missing after 5 days, or the sale is not priced in US dollars. |
Accepted prices are returned for sales priced in US dollars (ebay.com). On other marketplaces,
accepted-offer rows return not_available.
Look up saved prices later (free)
GET /v1/best-offer-prices returns the saved accepted prices for up to 100 item IDs at once. It does not
count against your monthly requests, so a daily job can fill in pending rows from earlier searches in
one call.
curl -H "Authorization: Bearer cs_live_REPLACEWITHYOURKEY" \
"https://api.compsniper.com/v1/best-offer-prices?itemIds=389012345678,389087654321"{
"items": [
{ "itemId": "389012345678", "acceptedOfferPrice": "405.00", "acceptedOfferPriceStatus": "found" },
{ "itemId": "389087654321", "acceptedOfferPrice": null, "acceptedOfferPriceStatus": "pending" }
],
"requestId": "..."
}An item ID that was never seen in a bestOfferPrice=true search returns the status unknown. The lookup
uses your normal per-minute rate limit.
Card Batch
Card Batch jobs accept the same option as options.bestOfferPrice: true, and each accepted-offer sale in
the results carries acceptedOfferPrice and acceptedOfferPriceStatus. See Card Batch.
Good to know
- Works on sold searches only. It is ignored with
sold=false. - A search with accepted-offer rows can take a few seconds longer while prices are looked up. A problem with the lookup never fails the search itself.
- Use
acceptedOfferPricewhen it isfoundand fall back tosoldPriceotherwise, so your median reflects what buyers really paid.