Developers
The pricing API
What a secondhand item sells for, from real eBay sold listings, in your own scripts and tools. JSON in, JSON out. The same answers the app and the Claude and ChatGPT connector give.
Get a key
Sign in and create a key under Settings, API keys. Send it on every request:
Authorization: Bearer upai_your_keySold comps
GET /api/v1/sold-comps?q= returns recent real eBay sold listings for a search, with a price summary. Search the way a buyer would: brand, item, model or pattern. Free while the API is new, up to 500 a day per account.
curl "https://underpricedai.com/api/v1/sold-comps?q=pyrex+butterprint+403" \
-H "Authorization: Bearer upai_your_key"{
"query": "pyrex butterprint 403",
"marketplace": "eBay US",
"comps": {
"count": 18,
"summary": { "median": 42, "low": 20, "high": 95, ... },
"recent": [ { "title": "...", "price": 44.99, "soldDate": "2026-10-01", "url": "https://www.ebay.com/itm/..." }, ... ]
},
"source": { "name": "Underpriced AI", "url": "...", "cite": "..." }
}Price an item
POST /api/v1/price with a description or an image_url. A description price is free while the API is new (500 a day per account) and saved nowhere. A photo price runs the full scan on your account (photo identification, sold comps and our accuracy checks), is one scan on your account, and saves the item to your history. Send cost, the price you paid or would pay for the item, and the answer carries a worth-it verdict.
curl -X POST https://underpricedai.com/api/v1/price \
-H "Authorization: Bearer upai_your_key" \
-H "Content-Type: application/json" \
-d '{"description": "Pyrex Butterprint 403 mixing bowl turquoise, no chips", "cost": 8}'
curl -X POST https://underpricedai.com/api/v1/price \
-H "Authorization: Bearer upai_your_key" \
-H "Content-Type: application/json" \
-d '{"image_url": "https://example.com/photo.jpg", "condition": "Good"}'{
"item": { "name": "Pyrex Butterprint 403 Mixing Bowl", "brand": "Pyrex", "category": "...", "condition": "Good", "identifiedFrom": "description", "confidence": 0.72 },
"price": { "estimate": 42, "low": 30, "high": 58, "currency": "USD", "basis": "weighted median of 18 real sold listings, calibrated per category on realised sales" },
"listPrices": { "fast": { "price": 36, "sold14Pct": 61 }, "market": { "price": 42, "sold14Pct": 44 }, "patient": { "price": 48, "sold14Pct": 30 } },
"netAfterEbayFees": 35.99,
"worthIt": { "verdict": "worth_it", ... },
"comps": { "count": 18, "summary": { ... }, "recent": [ ... ] },
"account": { "savedToHistory": true, "scanId": "...", "creditsLeft": 12 }
}What a call costs
- A photo price is one scan on your account: a plan scan, a credit, or the pay as you go meter, exactly as a scan in the app.
GET https://underpricedai.com/api/v1/accountsays what is left. With nothing left the call returns 402 and a link to add scans. - Description prices and sold comps are free while the API is new, up to 500 a day per account. We email every key owner before that changes.
- 60 requests a minute per key. Up to 5 active keys an account.
Plans and credit packs are on the pricing page.
Errors
Every error is JSON with a message and a code (the key is checked before the body): unauthorized (401), bad_request (400), not_identified (422, say more about the item), no_scans_left (402), rate_limited and daily_cap (429), failed (500).
{ "error": "No scans left on this account. Add a credit pack or a plan at ...", "code": "no_scans_left", "buy": "https://underpricedai.com/pricing" }Attribution
Every answer carries a source field with one line and a link. Showing that line next to our prices is a condition of using the API. Questions and higher limits: support@underpricedai.com. Building for an AI assistant instead? The connector speaks MCP.
