BestPrice.gr API

Greek shop prices for one product, in one call

The BestPrice.gr API turns Greece's second large price-comparison site into JSON in three actions.

no credit card1,000 free credits · instant API key · pay by card or crypto
Missing a BestPrice.gr endpoint, or need a source we don't have yet?Contact us real people · same-day reply.
B
/bestprice/v1

3 active endpoints, on 2 and 3 credit tiers.

  • POST/bestprice/v1/search
  • POST/bestprice/v1/product
  • POST/bestprice/v1/category

What BestPrice.gr endpoints does ReefAPI ship?

3 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.

3 endpoints

search

2 cr

Search BestPrice by keyword.

required
query
optional
page, limit

product

3 cr

One product with EVERY shop offer.

required
product_id
optional

category

2 cr

Browse one category's grid without a keyword.

required
category_id
optional
page, limit, query

Every parameter, every allowed value →

BestPrice.gr API

3 of 3 endpoints, ready to run

View docs ↗

The offer table for one product: each shop's name, its price in euros, its stock line and its link, with the product's brand, GTIN, Greek category path, customer rating and the market's low and high price.

3 credits1 required · 0 optional
POST/bestprice/v1/product
idle
// Press "Try it" and this pane shows exactly what the
// live site returned this second — including an empty
// result, if that is the truth. No key, no account.

How the BestPrice.gr API works

BestPrice.gr is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.

01
Authenticate
x-api-key header

No OAuth app, no request signing, no per-site account. One key covers all 280 engines.

02
Call
POST /bestprice/v1/…

Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.

03
Pay
2 or 3 credits per call

Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.

04
Read
{ ok, data, meta, error }

One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.

From a Greek keyword to every listed shop's price

Two calls. The grid gives you one price per product, which is the card price; the comparison itself is the product call, and that is where the band and the per-shop prices are.

01search
POST/bestprice/v1/search
{"query": "iphone 15"}

The grid. Take products[].product_id, and note category_id if you want to walk the whole shelf afterwards.

02product
POST/bestprice/v1/product
{"product_id": "2159006120"}

The shop table: every listed shop with its price, stock and link, plus price_low_eur, price_high_eur and offer_count for the market as a whole.

03category
POST/bestprice/v1/category
{"category_id": "806"}

The same rows as search without a keyword, for sweeping a category rather than chasing one product.

A Greek price picture from two calls: the market's band and count, and the individual shop prices behind it — with offers_listed telling you exactly how much of the table you are holding.

request
curl -X POST https://api.reefapi.com/bestprice/v1/product \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{}'
response envelope
{
  "ok": true,
  "data": { … },
  "meta": {
    "api": "bestprice",
    "endpoint": "product",
    "mode": "live",
    "latency_ms": …,
    "record_count": …
  },
  "error": null
}

Which BestPrice number is which

Four of these fields look interchangeable and are not. Measured through the live gateway on 2026-09-23.

FieldWhat it isMeasured example
price_eur (search row)The price BestPrice prints on the grid card, in euros610.00 on the iPhone 15 128GB card
price_low_eur / price_high_eurThe band across the WHOLE market for that product, as the product page states it610.00 to 999.00 while the market had 74 shops
offer_countHow many shops the market has for the product74, 87 and 71 on three measured products
offers_listedHow many offers THIS response carries. The product page lists the first thirty30 of 74; but 23 of 23 and 3 of 3 where the market is smaller
offers[].price_eurOne shop's own price. The lowest of these equals price_low_eur701.33 lowest, 885.00 highest listed, on a product whose band reaches 964.26
shop_count (search row)The shop count printed on the grid card, when the card carries onefilled on 76 of 103 measured rows
offers[].availabilityThe stock line the shop declares, per offerInStock on 28 rows and BackOrder on 2 of the same product

The band and the offer list answer different questions: price_high_eur describes the whole market, while the offers array stops at the thirty the product page lists, so the highest listed offer can sit below price_high_eur. Compare like with like by reading offer_count beside offers_listed.

One market, one currency, and the two counts that are not the same number

bestprice.gr only: Greece, euros, and a numeric product id. Measured through the live gateway on 2026-09-23 across 103 search rows from six queries and a category, plus eight product pages. Two of these lines go against us.

Greece, in euros, with no country parameter

This engine reads bestprice.gr. Prices are euros on every row and come back as numbers, titles and stock lines come back in Greek as the site writes them, and there is no other storefront behind the source, so there is no country to choose. Greek and English keywords were both measured and both work.

Against us: the offer table stops at the thirty the product page lists

The product page itself lists the first thirty offers, so that is the ceiling, and the response says so rather than implying it read the whole market. Measured on eight products: 30 of 74, 30 of 87, 30 of 71, 25 of 26, 23 of 23, 23 of 23, 23 of 23 and 3 of 3. Where the market has thirty shops or fewer — which was five of the eight — you get all of them. offers_listed and offer_count are both returned so the difference is never a guess.

Against us: the price band describes the market, not the offers you were handed

price_low_eur and price_high_eur are the band the product page states for the whole market, while the offers array is the listed subset, so the highest listed offer can be below price_high_eur. Measured: a product with an 87-shop market had a band of 701.33 to 964.26 while the highest of its 30 listed offers was 885.00. The lowest listed offer did equal price_low_eur, which is the number a price tracker usually wants.

What is filled on a grid row, counted rather than assumed

Across 103 rows from six queries and one category: product_id, title, url, price, image and category id on 103 of 103. shop_count on 76 of 103, because BestPrice does not print a shop count on every card. Nothing is invented to fill the gap — a card without a count returns null.

Ratings are null when the site publishes none

The customer rating and its count come back when BestPrice shows them — 4.9 from 126 ratings and 5.0 from 2 on measured products — and as null when it does not, which was the case on four of the eight products measured. A zero would read as a bad product rather than as an absent rating, so it is not used.

A wrong id is an error, not an empty success

The site answers an unknown product or category with an ordinary page rather than a 404, which is exactly how a scraper ends up returning a confident empty result. Measured: a dead product id and a category id the site does not have both come back as NOT_FOUND, and a search with no query as MISSING_PARAM, each with zero credits charged.

A second Greek source beside Skroutz

Greece has two large comparison sites and they do not carry identical merchant sets or rank them the same way. This engine is the BestPrice side; Skroutz is a separate engine with its own actions. Reading both is how a Greek pricing tool sees the market rather than one site's view of it.

What people build with BestPrice.gr

The jobs this data is most often used for.

3

endpoints

2/3

credits per call

01

Greek price monitoring: one product id, every listed shop's price and stock, plus the market's low and high in euros.

02

Repricing for Greek e-shops: watch where your own shop sits in the offer table for the products you carry.

03

Cross-checking a second comparison site beside Skroutz before publishing a price or a claim about the cheapest offer.

04

Catalogue enrichment: brand, GTIN, the Greek category path and the product image from a keyword or a category walk.

What BestPrice.gr data costs

The cheapest call here is 2 credits, so $15/mo (Pro) buys 5,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.

Full pricing →
$0.67–$1.50 / 1,000 credits
  • 1,000 free credits on signup, no card
  • One key, all 280 APIs, one credit pool
  • Failed and blocked calls are never charged
  • Credits roll over and never expire

Call it in two lines

Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.

curl
curl -X POST https://api.reefapi.com/bestprice/v1/product \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{}'
python
import requests

r = requests.post(
    "https://api.reefapi.com/bestprice/v1/product",
    headers={"x-api-key": REEF_KEY},
    json={},
)
print(r.json()["data"])
FAQ

Have a question? We got answers.

The questions people actually ask before wiring up BestPrice.gr.

Get a free key →
Do I get every Greek shop selling a product?

You get every offer the product page lists, which is the first thirty, and you are told how many the market has. Measured on eight products on 2026-09-23: 30 of 74, 30 of 87, 30 of 71, 25 of 26, and 23 of 23, 23 of 23, 23 of 23 and 3 of 3 where the market had thirty or fewer shops. So for most products you get all of them, and for the very crowded ones you get the cheapest end of the table plus an honest count of what is behind it. offers_listed and offer_count are both in the response so you never have to guess which you are holding.

Does it work with Greek keywords?

Yes, and that is the better way to search it. Greek queries were measured alongside English ones on 2026-09-23 and returned the same shape of rows, so a category phrase in Greek works as naturally as a brand and model in Latin letters. Titles, the category path and the stock lines come back in the site's own language, unmodified.

Is the price a number, and in which currency?

A number, in euros, on every row. The site's own markup carries the price as an integer, which is the trap a hand-written parser walks into and publishes a price a hundred times too large; the conversion happens once inside the engine, so price_eur is 610.0 and never 61000. There is one currency here because there is one market: bestprice.gr is Greece only, and there is no country parameter behind it.

How do I go from a search result to the shop comparison?

Every search and category row hands back product_id, and product takes that id or a full bestprice.gr product URL. A dead or wrong id is answered with NOT_FOUND rather than an empty-looking success, which matters here because the site answers an unknown product with a normal page rather than a 404.

What does this add if I already use Skroutz?

A second Greek comparison site for the same product. The two rank shops differently and do not carry identical merchant sets, so reading both is how a Greek pricing tool sees the market rather than one site's view of it. Both are separate engines here with their own actions and their own credit prices.

Which fields can be empty?

Measured across 103 rows on 2026-09-23: product_id, title, url, price, image and category id were filled on all 103, and shop_count on 76 of them, because BestPrice does not print a shop count on every grid card. On the product side, the rating and its count come back as null when the site publishes no rating for that product, which was the case on four of the eight measured products, rather than being dressed up as a zero.

What is the BestPrice.gr API?

BestPrice.gr API is a ReefAPI endpoint group for greek price comparison: every shop's price for one product, the market's price band and the shop count, in eur. It returns live JSON through POST requests under /bestprice/v1.

Is the BestPrice.gr API free to try?

Yes. ReefAPI starts with 1,000 free credits, no card required. BestPrice.gr calls use the same shared credit balance as every other ReefAPI engine.

Do I need a BestPrice.gr login or account?

No login to BestPrice.gr is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.

How fresh is the BestPrice.gr data?

The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.

How many credits does the BestPrice.gr API use?

BestPrice.gr actions currently cost 2-3 credits per successful call. Failed or blocked calls are free. All APIs draw from one credit pool.

Can I call BestPrice.gr from an AI assistant or MCP client?

Yes. Connect ReefAPI once through MCP and your assistant can call bestprice actions with the same key, credit pool and JSON envelope used by normal REST requests.

Is the BestPrice.gr API a BestPrice.gr scraper?

It is the managed alternative to a DIY BestPrice.gr scraper. Instead of building and maintaining your own scraper — proxies, headless browsers, captcha and constant breakage — you call one ReefAPI endpoint and get the same greek price comparison: every shop's price for one product, the market's price band and the shop count, in eur back as clean JSON.

Why does my BestPrice.gr scraper keep getting blocked?

Most BestPrice.gr scrapers break on anti-bot defenses, rate limits and IP bans that need rotating residential proxies and browser fingerprinting to clear. ReefAPI handles all of that for you — no proxies, no captchas, no maintenance — and returns live JSON. Blocked calls are free.

116 E-commerce & Marketplaces APIs on the same key

One key, one credit pool, one response envelope. If you are pulling BestPrice.gr, you are one call away from the rest of the category — no second contract, no second integration.

Need something this API does not do?

Name the endpoint, the field, or a source we do not carry yet. We ship new APIs every week and you would be first to get the key. Real people read every message and reply the same day.

0/4000

No account needed · we reply from [email protected]

Try it on your own data before you pay anything

The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 279 APIs, and the same envelope everywhere.

Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts. Field notes were captured on 2026-09-23.