Back Market API & Scraper
Back Market is a marketplace, not a shop: one product page is a competition between sellers and condition grades, and the price you see depends on which grade and which seller won the box.
🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.
This API returns that competition. `search` gives you the grid one storefront shows — title, price in that market's currency, the price string the site itself printed, Back Market's own condition grade, stock, warranty months and the new-retail reference price — with the storefront's own exact match count so you can tell a filter that bit from one that was ignored. `detail` takes one product id and returns every live offer for it in one call: each offer's grade, its own price, its own stock, its own warranty and its own seller id, cheapest first, plus the grades available, how many sellers are competing and the spread between the cheapest and the dearest. On one live iPhone 13 128 GB on backmarket.de that was 7 offers from 5 sellers across 4 grades, 258.00 to 365.00 EUR — a 107 EUR spread on the same phone. Market is a parameter, not a guess: the same device is a different price, a different currency and a different condition wording in each of the 15 storefronts.
What a row carries
Field fill measured on 60 rows pooled across three categories (phones, laptops, audio) on backmarket.de, 2026-10-08. The numeric price was checked against the price string the storefront itself printed on the same row: 60 of 60 agreed.
| Field | Fill | What it is |
|---|---|---|
| product_id | 60/60 | The product UUID. Pass it straight back to `detail`, or read it off the last path segment of any Back Market product URL. |
| price + currency | 60/60 | The live offer price and the ISO currency of that storefront. The currency is read off the row, not assumed from the country. |
| price_display | 60/60 | The price string the storefront itself rendered ("258,00 €", "$669.00", "£395.00"). A free second witness for the number beside it. |
| grade + grade_value | 60/60 | Back Market's condition grade. `grade_value` is the source's own number and is the same in every market; `grade` is the stable name for it. |
| grade_label | 60/60 | The same grade in that storefront's own words. Value 12 prints as "Gut" on backmarket.de, "Fair" on backmarket.com and "Buono" on backmarket.it — all three measured. |
| price_new_reference | 60/60 | The new-retail reference the site prints struck through. NOT a Back Market price: 729.00 EUR beside a 258.00 EUR refurbished iPhone 13. `discount_pct_vs_new` is computed from the pair. |
| stock | 60/60 | The seller's own quantity for that offer. 0 is returned as 0, never as empty. |
| warranty_months | 60/60 | The warranty the listing states, in months. |
| seller_id | 60/60 | The marketplace's numeric seller id, so you can group or follow one seller. Back Market publishes no seller NAME on this surface, so none is invented. |
| rating + rating_count | 60/60 | The product's rating and review count. Product level, not seller level: it is identical on all 7 offers of one product across 5 different sellers, and it matches the rating the product page itself publishes. |
| brand / model / colour / category | 60/60 | Manufacturer, exact model, colour in that market's language, and the category with its numeric id. |
| specs_summary | 60/60 | The one-line spec string the storefront prints under the title ("Mitternacht • 128 GB • Physische SIM + eSIM"). |
| scores | 28/60 | Back Market's own repairability, camera, performance, screen and longevity scores. Published for some categories only — 24 of 24 laptop rows, 4 of 24 phone rows, 0 of 12 audio rows. Empty where the source publishes none. |
Only about 1000 rows are retrievable per query however large the total is: the whole backmarket.de catalogue reports 18,141 matches but serves 42 pages of 24, 20 of 50 or 10 of 100. `pagination` says where the floor is on every response, and past the last page the source returns an empty page rather than repeating the last one.
Real request and response JSON
Captured from the indexed primary action, search, on .
{
"method": "POST",
"url": "https://api.reefapi.com/backmarket/v1/search",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"query": "iphone 13",
"market": "de",
"page_size": 24
}
}{
"ok": true,
"meta": {
"api": "backmarket",
"endpoint": "search",
"mode": "live",
"latency_ms": 1060,
"record_count": 24,
"bytes": 69188,
"cache_hit": false,
"market": "de",
"locale": "de-de",
"currency": "EUR",
"total": 45,
"rows": 24,
"index": "prod_index_backbox_model_de-de",
"sort": "best_sellers",
"pagination": {
"page": 1,
"page_size": 24,
"last_page": 2,
"retrievable_max": 1000,
"has_more": true,
"note": "the source serves at most about 1000 rows per query however large `total` is; `last_page` is its own figure for this page size"
},
"filters_applied": {},
"price_stats": {
"min": 13.45,
"max": 1006,
"avg": 403.769,
"sum": 208749
},
"charged_credits": 2,
"version": "1.0.0",
"request_id": "0820f2b260fd4f48",
"queue_ms": 1.3,
"fetched_at": "2026-10-08T11:33:18.902Z"
},
"data": {
"products": [
{
"product_id": "ef5660d2-6883-4b81-b47d-86e5720687ef",
"offer_id": "ef5660d2-6883-4b81-b47d-86e5720687ef_12_0",
"listing_id": "f9abe313-b2dc-4be2-b846-cb21c458c194",
"title": "iPhone 13 128GB - Mitternacht - Ohne Vertrag",
"model_name": "iPhone 13",
"url": "https://www.backmarket.de/de-de/p/iphone-13-128-gb-ohne-vertrag/ef5660d2-6883-4b81-b47d-86e5720687ef?l=12",
"image": "https://d2e6ccujb3mkqf.cloudfront.net/ef5660d2-6883-4b81-b47d-86e5720687ef-1_72ddd233-c9b6-4f10-a739-447c440b6357.jpg",
"market": "de",
"price": 263,
"currency": "EUR",
"price_display": "263,00 €",
"price_new_reference": 729,
"price_new_reference_display": "729,00 €",
"discount_pct_vs_new": 64,
"has_deal": null,
"flash_sale_discount_pct": null,
"grade": "good",
"grade_value": 12,
"grade_label": "Gut",
"condition": "Refurbished",
"brand": "Apple",
"model": "iPhone 13",
"colour": "Mitternacht",
"category": "Smartphone",
"category_id": 2,
"connector": "Lightning",
"sim_lock": "Ohne Vertrag",
"specs_summary": "Mitternacht • 128 GB • Physische SIM + eSIM",
"colour_options": [
"Blau",
"Grün",
"Mitternacht"
],
"stock": 3,
"warranty_months": 12,
"seller_id": 9774,
"rating": 4.45,
"rating_count": 89244,
"scores": {
"global": 76.25,
"camera": 60,
"performances": 67.5,
"screen_quality": 87.5,
"life_expectancy": 85
}
},
{
"product_id": "89e87dd7-d5b3-44dc-8972-c370c31bd6e6",
"offer_id": "89e87dd7-d5b3-44dc-8972-c370c31bd6e6_12_0",
"listing_id": "e63f4468-a924-4977-95f3-db82b912c9a6",
"title": "iPhone 13 mini 128GB - Blau - Ohne Vertrag",
"model_name": "iPhone 13 mini",
"url": "https://www.backmarket.de/de-de/p/iphone-13-mini-128-gb-blau-ohne-vertrag/89e87dd7-d5b3-44dc-8972-c370c31bd6e6?l=12",
"image": "https://d2e6ccujb3mkqf.cloudfront.net/89e87dd7-d5b3-44dc-8972-c370c31bd6e6-1_b6c08496-f300-463f-9275-8e1b6c35c253.jpg",
"market": "de",
"price": 242,
"currency": "EUR",
"price_display": "242,00 €",
"price_new_reference": 799,
"price_new_reference_display": "799,00 €",
"discount_pct_vs_new": 70,
"has_deal": true,
"flash_sale_discount_pct": null,
"grade": "good",
"grade_value": 12,
"grade_label": "Gut",
"condition": "Refurbished",
"brand": "Apple",
"model": "iPhone 13 mini",
"colour": "Blau",
"category": "Smartphone",
"category_id": 2,
"connector": "Lightning",
"sim_lock": "Ohne Vertrag",
"specs_summary": "Blau • 128 GB • Physische SIM + eSIM",
"colour_options": [
"Blau",
"Grün",
"Mitternacht"
],
"stock": 1,
"warranty_months": 12,
"seller_id": 25913,
"rating": 4.41,
"rating_count": 26514,
"scores": {
"global": 64,
"camera": 60,
"performances": 50,
"screen_quality": 50,
"life_expectancy": 100
}
},
{
"product_id": "f597a490-5e4c-450c-88a8-14be4d46f9c1",
"offer_id": "f597a490-5e4c-450c-88a8-14be4d46f9c1_12_0",
"listing_id": "b140a670-128e-431f-aefc-fd7407d3dec8",
"title": "iPhone 13 Pro 128GB - Sierrablau - Ohne Vertrag",
"model_name": "iPhone 13 Pro",
"url": "https://www.backmarket.de/de-de/p/iphone-13-pro-128-gb-sierrablau-ohne-vertrag/f597a490-5e4c-450c-88a8-14be4d46f9c1?l=12",
"image": "https://d2e6ccujb3mkqf.cloudfront.net/f597a490-5e4c-450c-88a8-14be4d46f9c1-1_63b2dc6b-b214-4fbb-9493-3c6a95049b39.jpg",
"market": "de",
"price": 368,
"currency": "EUR",
"price_display": "368,00 €",
"price_new_reference": 1149,
"price_new_reference_display": "1.149,00 €",
"discount_pct_vs_new": 68,
"has_deal": null,
"flash_sale_discount_pct": null,
"grade": "good",
"grade_value": 12,
"grade_label": "Gut",
"condition": "Refurbished",
"brand": "Apple",
"model": "iPhone 13 Pro",
"colour": "Sierrablau",
"category": "Smartphone",
"category_id": 2,
"connector": "Lightning",
"sim_lock": "Ohne Vertrag",
"specs_summary": "Sierrablau • 128 GB • Physische SIM + eSIM",
"colour_options": [
"Alpingrün",
"Gold",
"Graphit"
],
"stock": 28,
"warranty_months": 12,
"seller_id": 1,
"rating": 4.38,
"rating_count": 33217,
"scores": {
"global": 77.25,
"camera": 60,
"performances": 82.5,
"screen_quality": 85,
"life_expectancy": 85
}
}
]
}
}What the Back Market API does
| Action | Description | Concrete use case | Key params |
|---|---|---|---|
| search | Search or browse one Back Market storefront. `market` picks the storefront and therefore the catalogue, the price list and the currency. Give `query` for keyword search, or leave it out and use `brand` / `model` / `category_id` / `grade` / `storage` / `colour` / `price_min` / `price_max` / `deals_only` to walk a slice of the catalogue — every one of those filters was measured against the unfiltered total in the same run and every one changes it. `total` is the storefront's own exact count for the request, so an ignored filter is impossible to miss. Each row carries Back Market's own condition grade (name, numeric value and the storefront's own label), the live price with the market's currency AND the price string the site itself printed, the separate new-retail reference price, stock, warranty months and the seller's numeric id. 🔴 Only about 1000 rows are retrievable per query however large `total` is — `pagination` says where the floor is. | Pricing teams call search to search or browse one Back Market storefront. | market, query, brand, model, colour, ... |
| detail | Every live seller offer for ONE product in one market, by `product_id`. This is the action that makes Back Market worth querying: a product page is a competition between sellers and grades, and this returns the whole ladder in one call — each offer with its own condition grade, its own price in the market's currency, its own stock, its own warranty and its own seller id, cheapest first. On top of that it returns the product itself: title, brand, model, colour, storage summary, category, the colour options the source lists, the new-retail reference price, the product rating with its review count and Back Market's own repairability, camera, performance, screen and longevity scores. `price_range`, `grades_available` and `sellers_count` are computed from the offers in the same response. A product id that is not live in that market answers NOT_FOUND — never an empty success (verified against a non-existent UUID, which the source answers with total 0). | Marketplace operators call detail to get every live seller offer for ONE product in one market, by `product_id`. | product_id, market, grade |
| categories | The live category tree of one storefront, read off the storefront's own navigation: every universe (Smartphones, Laptops, Tablets, Audio, Gaming, Household …) with its child categories, each with the id you can pass back as `category_id` and the title in that market's own language. Cheap lookup action — one small request, no product data. Use it to discover what a market actually sells before searching it. | Catalog enrichment teams call categories to get the live category tree of one storefront, read off the storefront's own navigation. | market |
| markets | The storefronts this engine serves, with each one's host, locale and ISO currency — every value verified against a live query of that storefront, plus the two storefronts that exist but whose search back end refuses us and the two hostnames that do not resolve at all. No network call, no credit-worthy work: this is the honest coverage map, including the parts that go against us. | Retail analysts call markets to get the storefronts this engine serves, with each one's host, locale and ISO currency. | none |
Call search from your stack
curl -X POST https://api.reefapi.com/backmarket/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"iphone 13","market":"de","page_size":24}'import requests
r = requests.post(
"https://api.reefapi.com/backmarket/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"query": "iphone 13",
"market": "de",
"page_size": 24
},
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/backmarket/v1/search", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"query": "iphone 13",
"market": "de",
"page_size": 24
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.backmarket.search with {"query":"iphone 13","market":"de","page_size":24}.Who uses this API and why
- Repricing: pull every offer for your own product ids with `detail` and see exactly where you sit against the other sellers on each grade, including the stock behind each price.
- Buy-side sourcing: scan a grade and price band across all 15 storefronts to find where a model is cheapest right now, with each market's own currency on the row.
- Price-tracking and alerting: `search` with a tight filter plus the storefront's own total makes a stable daily series per model, grade and market.
- Resale and trade-in valuation: the grade ladder and the new-retail reference price on the same row give you the depreciation curve a refurbished device actually trades at.
- Market research on refurbished electronics: category and brand totals per storefront, plus Back Market's own repairability and longevity scores, as a dataset rather than a dashboard.
Questions developers ask before integrating
Which Back Market storefronts does this cover?
15, each verified with a live query: Germany, United States, United Kingdom, Italy, Netherlands, Belgium, Austria, Portugal, Finland, Ireland, Greece, Slovakia, Sweden, Japan and Australia — 5 currencies (EUR, USD, GBP, JPY, AUD, SEK). backmarket.fr and backmarket.es exist but we cannot read them, and they answer MARKET_UNAVAILABLE rather than pretending; backmarket.lu and backmarket.dk are not storefronts at all. The `markets` action returns that whole map, including the parts that go against us.
Why does the same phone have several prices?
Because Back Market is a marketplace and the condition grade is part of the product. One live iPhone 13 128 GB on backmarket.de had 7 offers from 5 sellers: Good 258.00 and 280.00, Excellent 289.00 and 314.00, Very good 289.99 and 309.00, Premium 365.00 EUR. `detail` returns all of them with their own stock and warranty, sorted cheapest first, so you can see the whole ladder instead of whichever offer happened to win the box.
Are the condition grades comparable across countries?
The number is, the wording is not. `grade_value` is Back Market's own code and is identical in every market, so filter and compare on it. The printed label is translated per storefront: value 12 is "Gut" in Germany, "Fair" in the United States and "Buono" in Italy. Both travel on every row, so you can compare on the number and show a human the local word.
Can I tell a filter that worked from one that was ignored?
Yes, and that is the point of returning the storefront's own total. On one run, keyword "iphone" on backmarket.de: 310 matches unfiltered, 69 with brand apple, 30 with grade premium, 41 with grade good, 37 with storage 256 GB, 289 under 300 EUR, 24 between 300 and 500 EUR, 38 deals only, 37 for the smartphone category. Every filter we publish was measured against the unfiltered total in the same run; a filter that did not change the total is not offered.
How deep can I page?
About 1000 rows per query, which is the source's own ceiling and not ours. The total is honest — backmarket.de reports 18,141 for an empty query — but only 42 pages of 24 are served. `pagination.last_page`, `pagination.retrievable_max` and `pagination.has_more` are on every response. Narrow with brand, model, category, grade or a price band to get under the ceiling rather than paging into it.
Does it return the seller's name?
No, because Back Market does not publish one on the surface we read. You get the numeric `seller_id`, which is enough to group offers by seller, count how many sellers compete on a product and follow one seller over time. We would rather return an id that is real than a name that is guessed.
What happens with a product that is sold out or does not exist in that market?
NOT_FOUND, with the storefront's own match count in the message, and it is not retried. A product that exists in Germany and not in Japan is a real answer, not an error on our side — try another `market`, or call `markets` to see the list. An empty success is never returned in its place.
Is the price the final price?
It is the offer price that storefront publishes for that grade and that seller, in that storefront's currency, at the moment of the call. Shipping, local tax handling and payment-method surcharges are set at checkout and are not part of this surface, so they are not returned.
What is the Back Market API?
Back Market API is a ReefAPI endpoint group for refurbished electronics marketplace across 15 country storefronts It returns live JSON through POST requests under /backmarket/v1.
Is the Back Market API free to try?
Yes. ReefAPI starts with 1,000 free credits, no card required. Back Market calls use the same shared credit balance as every other ReefAPI engine.
Do I need a Back Market login or account?
No login to Back Market 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 Back Market 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 Back Market API use?
Back Market actions currently cost 1-2 credits per successful call. Failed or blocked calls are free. All APIs draw from one credit pool.
Can I call Back Market from an AI assistant or MCP client?
Yes. Connect ReefAPI once through MCP and your assistant can call backmarket actions with the same key, credit pool and JSON envelope used by normal REST requests.