🔌 FlipTip API

Real resale prices, inside your app

Send a photo or an item name — get the exact model and what it actually sold for: median, range, number of sales and the most to pay. From real completed eBay sales, each one checked by AI against the item.

🏷️

For reseller apps

Crosslisting, inventory and listing tools: when your user adds an item, fill in the title and a price that is backed by real sales.

  • identify — photo → brand, model, model number, how sure (measured in public tests), plus its sold prices.
  • price — item name → median, range, sales count, dates, the most to pay, and buy-or-skip at an asking price.
  • US, UK, Canada, Australia, Germany, France, Italy and Spain.
📦

For liquidation pallets

Know what a pallet is worth before you bid. Send the manifest; get each line's real resale value, the total after fees and the most to bid.

  • manifest — Excel (.xlsx), CSV or a list of items with UPC and condition; the same item on several lines is checked (and charged) once.
  • Most valuable lines first; lines with no sales are marked, never guessed.
  • No code needed: the pallet manifest checker does it in the browser.

💬 Run a flipping Discord server? Add the FlipTip bot — /price, /flip and /identify in your channels, on the same credits. No code.

Credits

Pay as you go: buy a pack, use it when you need it. Credits never expire. Separate from the scanner plans.

CallCreditsWhat you get
price1Sold prices of one item in one market
manifest1 per unique itemEach line priced, the total and the most to bid
identify5Photo → exact model, plus its sold prices
usage, results0Credits left, a manifest's results and CSV

Never charged: a call that fails, a photo nothing could be named from, a line whose prices couldn't be checked.

Sign in to buy credits

Every account gets 25 free credits to try it. Paid securely with PayPal (card or PayPal balance). Credit packs are final and non-refundable. Need more than 20,000 a month? Ask for volume pricing.

Your API key

Sign in to get a key — 25 free credits to try it, no card.

Sign in with Google

Reference

Base URL https://fliptip.ai/api/v1. Send JSON (Content-Type: application/json) and your key in a header:

Authorization: Bearer ftk_your_key

Call it from your server — never put the key in a web page or a phone app, where anyone could copy it and use your credits.

The responses below are examples — their numbers are illustrative.

market (optional, default us): us, uk, ca, au, de, fr, it, es. Prices come back in that market's currency. The item name can be in any language — it is turned into the words sellers use on that eBay site.

POST /price

What one item sells for. query (required), market, condition (new · used · parts), asking_price and fee_pct (for a buy-or-skip verdict; fees default 15 %).

curl https://fliptip.ai/api/v1/price \
  -H "Authorization: Bearer $FLIPTIP_KEY" -H "Content-Type: application/json" \
  -d '{"query":"Nintendo Switch OLED","market":"us","asking_price":180}'
{
  "ok": true, "query": "Nintendo Switch OLED", "market": "us",
  "match": "model", "searched": "nintendo switch oled console", "site": "ebay.com", "currency": "USD",
  "sold": { "count": 31, "median": 239.0, "low": 205.0, "high": 275.0, "first_date": "2026-10-02", "last_date": "2026-11-12" },
  "max_buy": 149.0,
  "verdict": { "asking": 180.0, "buy": false, "profit_estimate": 23.15, "fee_pct": 15.0 },
  "credits_left": 248
}

match: model — sales of the item itself; line — too few of the exact model, so sales of its product line (treat as a rough guide); none — no trustworthy sales (sold is null). When the sold prices can't be checked at that moment, price answers 503 busy and uses no credits; inside identify the price then has match: "error". max_buy is FlipTip's rule: median ÷ 1.6, which leaves room for fees, shipping and profit.

POST /identify

A photo of one item → its identity and sold prices. image (base64 JPEG, PNG or WebP up to 6 MB, a data: URL is fine) or images (up to 3 photos of the same item: front, label, back), or a multipart file field image. No credits are used when nothing can be named.

curl https://fliptip.ai/api/v1/identify \
  -H "Authorization: Bearer $FLIPTIP_KEY" -F "[email protected]" -F "market=de"
{
  "ok": true, "market": "de",
  "identity": { "title": "Canon AE-1 Program 35mm SLR", "brand": "Canon", "model_number": "AE-1 Program",
                "exact_model": true, "confidence": 92, "measured_right_pct": 81,
                "alternatives": [ { "title": "Canon AE-1", "confidence": 20 } ], "condition_seen": "used" },
  "price": { "match": "model", "searched": "canon ae-1 program", "site": "ebay.de", "currency": "EUR",
             "sold": { "count": 22, "median": 165.0, "low": 129.0, "high": 210.0, "...": "..." }, "max_buy": 103.0 },
  "needs_review": false, "credits_left": 243
}

measured_right_pct: how often answers with this confidence were right in FlipTip's public accuracy test (null until there are enough tests). needs_review is true when only the line was told apart, the confidence is low, or the prices are not of the exact model — show those to your user before using them.

POST /manifest

A liquidation manifest → every line's resale value and the pallet's total. Send a multipart file file (.xlsx or .csv — first sheet), or csv (the manifest as text), xlsx (the file base64-encoded) or items ([{"title":"…","qty":2,"retail":49.99,"upc":"194253397168","condition":"customer returns"}]). The title, quantity, unit or extended retail, UPC/EAN and condition columns are found by their headers. Optional: market, pallet_cost, shipping_cost (freight to you), condition (the whole lot: new, used, untested or parts — overrides the column), fee_pct, sell_pct (how much of the lot you expect to sell, 10–100, default 80), name. Up to 500 lines.

Each line is priced from sales in its condition: new and shelf pulls from new sales, open box and used from used sales, salvage from for-parts sales, and untested customer returns at 0.75 × the used price (adjusted). With no sales in that condition, sales of any condition are used and any_condition is true. A UPC finds the product when the title is too vague.

curl https://fliptip.ai/api/v1/manifest \
  -H "Authorization: Bearer $FLIPTIP_KEY" -F "[email protected]" -F "pallet_cost=450" -F "shipping_cost=120"

Up to 8 different items are answered right away. A longer manifest returns 202 with a job_id; poll GET /manifest/{job_id} until status is done — each poll returns the lines checked so far (one poll can take up to a minute while it checks the next items) (stopped = credits ran out; the lines checked so far are kept, and the rest is checked once there are credits again). When sold prices can't be checked for a moment, note says so and the job goes on by itself a few minutes later — nothing is charged for a line until it has been checked. A line that still can't be checked after three tries is marked not_checked (free) and left out of the totals. Add ?format=csv for a spreadsheet.

{
  "ok": true, "job_id": "3f9c…", "status": "done", "progress": { "checked": 41, "of": 41 },
  "total": { "currency": "USD", "lines": 57, "unique_items": 41, "priced_lines": 49,
             "resale_value": 2310.5, "resale_low": 1840.0, "resale_high": 2795.0, "fee_pct": 15.0,
             "after_fees": 1963.93, "sell_pct": 80, "expected_after_fees": 1571.14, "shipping_cost": 120.0, "max_bid": 1107.46, "retail_total": 6420.0, "recovery_pct": 39.2,
             "estimate_incl_unpriced": 2488.1, "top5_value_pct": 38.4, "units_by_condition": { "untested": 41, "new": 16 },
             "pallet_cost": 450.0, "profit_estimate": 1001.14, "roi_pct": 175.6, "verdict": "buy" },
  "lines": [ { "title": "Apple AirPods Pro 2nd Gen", "qty": 2, "retail": 249.0, "upc": "194253397168",
               "condition": "Customer Returns", "condition_class": "untested", "status": "priced", "match": "model",
               "sold_count": 40, "sales_30d": 18, "median": 106.88, "low": 90.0, "high": 123.75, "adjusted": 0.75,
               "value": 213.75, "max_buy_each": 67.0, "flip_score": 71 } ]
}

expected_after_fees is the after-fees value of the share you expect to sell (sell_pct). max_bid is expected_after_fees ÷ 1.28, minus shipping_cost — at the default 80 % the same as the after-fees value ÷ 1.6. GET /manifest/{job_id}?sell_pct=60 recalculates the totals with another share, free. verdict: buy when the pallet costs no more than max_bid, thin when the pallet and freight cost more but less than expected_after_fees, skip otherwise; profit_estimate and roi_pct are after fees and freight, on the share you expect to sell. flip_score (0–100) rates each line by how often it sells, its price and — with a pallet price, shared out by retail — its margin. top5_value_pct: the share of the value in the 5 dearest lines. estimate_incl_unpriced adds the lines without sales at the same share of retail as the priced ones — an estimate, shown separately. Returns are often untested or damaged: bid lower when the manifest says so.

GET /usage

Credits left (bought_left: from packs, they never expire), this month's use. Free.

Errors

HTTPerrorMeaning
400bad_query bad_market no_image bad_image no_items bad_fileFix the request
401no_key bad_keyMissing, unknown or revoked key
402no_creditsNo credits left — buy a pack
422not_identifiedNothing could be named from the photo (no credits used)
429rate_limited120 requests a minute, 20 photos a minute, 10 manifests an hour
503busy offTry again in a few minutes (no credits used)

Every error is JSON: {"ok": false, "error": "…", "message": "…"}.

What the numbers are

Completed sales only — never asking prices — from the market's eBay site, each sale checked by AI against the item so accessories, parts and other models are left out. Answers carry the computed figures (median, middle-70 % range, count, dates), not the listings. The same item is cached for up to two weeks, so a popular model costs you a credit but is answered fast. Prices are an estimate of the market, not an appraisal.

Volume credits

An app with many users, pallets every week, or something else? Tell us what you need.

Sign in to ask or write to [email protected]