MPB API

Graded used camera gear, item by item: the grade, the shutter count and the price

The MPB API returns mpb.com, the managed marketplace for used photo and video equipment, as clean JSON in six actions: search, models, product, model, facets and suggest.

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

6 active endpoints, on 1, 2 and 3 credit tiers.

  • POST/mpb/v1/search
  • POST/mpb/v1/models
  • POST/mpb/v1/product
  • POST/mpb/v1/model
  • POST/mpb/v1/facets
  • POST/mpb/v1/suggest

What MPB endpoints does ReefAPI ship?

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

6 endpoints

search

2 cr

Search or browse one MPB storefront at ITEM level.

required
—
optional
query, market, brand, category, product_type, lens_mount, condition, price_min, price_max, sort, page, page_size, include_pii

models

1 cr

The same search, rolled up ONE ROW PER MODEL instead of one row per item.

required
—
optional
query, market, brand, category, product_type, lens_mount, condition, price_min, price_max, page, page_size, include_pii

product

3 cr

The complete record of ONE item by its sku, read off the product page a buyer sees.

required
sku
optional
slug, market, include_pii

model

2 cr

One MODEL and everything MPB has of it.

required
—
optional
model_id, slug, market, condition, include_pii

facets

1 cr

The live filter taxonomy of one MPB market.

required
—
optional
market, facets, query, brand, category, product_type, lens_mount, condition, price_min, price_max, include_pii

suggest

1 cr

MPB's own model autocomplete.

required
query
optional
market, count, include_pii

Every parameter, every allowed value →

MPB API

6 of 6 endpoints, ready to run

View docs ↗

Every live MPB item that matches, one row per physical camera: MPB's own cosmetic grade with its rank, the price in that storefront's currency, the shutter, hour or battery-charge count of that exact item, the lens mount, what is in the box, the photos and the direct product URL.

2 credits0 required · 12 optional
POST/mpb/v1/search
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 MPB API works

MPB 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 438 engines.

02
Call
POST /mpb/v1/…

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

03
Pay
1 or 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 camera you want to the exact copy worth buying

The step that pays off is the roll-up. A flat listing tells you a lens exists; models tells you how many graded copies MPB holds and from what price, and only then is it worth opening one item and reading what MPB found on it.

01models
POST/mpb/v1/models
{"market": "UK", "category": "Canon RF fit lenses"}

One row per model with the live in-stock count and the price band. Take a model's slug or its model_id.

02model
POST/mpb/v1/model
{"slug": "canon-eos-r6", "market": "UK"}

The model's spec sheet and expected accessories, plus every live copy cheapest first with its sku, grade, shutter count and price — 57 copies in stock when measured.

03search
POST/mpb/v1/search
{"market": "UK", "product_type": "Pro DSLR", "condition": "excellent", "price_max": 900, "sort": "price_asc"}

Or go the other way: filter the catalogue itself by grade, budget and gear class and read the shutter count on every row before you pick.

04product
POST/mpb/v1/product
{"sku": "4168605", "slug": "canon-eos-r6", "market": "UK"}

One item in full: MPB's own definition of its grade, the inspection notes it published, the accessory checklist with a present flag each, the shutter count, the spec sheet, every photo, and the other graded copies of the same model with their prices.

A specific physical camera, with its grade defined in MPB's own words, its usage counter, its flaws listed and its box contents known, priced against every other copy of the same model in that market.

request
curl -X POST https://api.reefapi.com/mpb/v1/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"query":"canon eos r6","market":"UK","sort":"price_asc"}'
response envelope
{
  "ok": true,
  "data": { … },
  "meta": {
    "api": "mpb",
    "endpoint": "search",
    "mode": "live",
    "latency_ms": …,
    "record_count": …
  },
  "error": null
}

MPB's seven cosmetic grades, and how much UK stock each one had on 2026-10-07

The grade names and the star rating are MPB's own, carried verbatim; the rank is the number MPB's own storefront filters on, so 0 is the worst and 6 the best. Counts are MPB's own totals for the UK catalogue in a single run (19,829 items unfiltered). Spares-and-repairs stock is excluded unless you ask for it by name, which is what MPB's own storefront does.

grade (MPB's own name)condition valuerankUK items
Brand newnew6170
Like newlike_new53,454
Excellentexcellent49,495
Goodgood35,936
Well usedwell_used2728
Heavily usedheavily_used156
Spares and repairsspares_or_repairs0excluded by default

Several grades can be OR-ed in one call: like_new plus excellent returned 12,943 of the same 19,829. The product action adds MPB's own written definition of the grade for that exact item, in the market's language.

What MPB publishes, what it does not, and what we measured

Measured on 2026-10-07 and 2026-10-08 against the live site, two runs per action with different parameters each time, all twelve successful. Values were cross-checked against the page a buyer sees on 24 items across all three catalogues and both price extremes, plus 15 further items across five gear groups. Every exposed filter was compared with the unfiltered total in the same run and against a second, narrower control. Several of these lines go against us.

The grade is returned three ways, and it is MPB's own

Every row carries the source's code (LIKE_NEW, EXCELLENT, GOOD, WELL_USED, HEAVILY_USED, NEW, SPARES_OR_REPAIRS), MPB's own display name for it, and MPB's own star rating as a rank from 0 to 6 — the same number MPB's storefront filters on, so it is comparable and sortable without any mapping of ours. UK stock in one run: Excellent 9,495, Good 5,936, Like new 3,454, Well used 728, Brand new 170, Heavily used 56. The product action adds MPB's written definition of that grade, in the market's language. Nothing is remapped and nothing is invented.

One usage counter per class of gear, as its own field

MPB publishes shutter actuations on bodies, recorded hours on camcorders and battery charge cycles on drones, and each is its own field rather than a line of prose. Measured over 24 rows per group: shutter_count 24 of 24 on professional DSLR bodies and 0 of 24 on prime lenses, hour_count 23 of 24 on camcorders, battery_charge_count 24 of 24 on drones, and none of them on batteries or chargers. A null is MPB publishing no counter for that kind of item. Six items checked row against item page agreed on all three counters 6 of 6.

A search row's price is the index price, and once in 24 it lagged

On 24 items across the UK, US and EU catalogues, taken from both the cheapest and the dearest end, the search index price equalled the product page price 23 times and disagreed once, by 250.00 EUR on a 16,499.00 EUR item. The product action therefore returns the page price, cross-checks it against the decimal string the page itself prints, and publishes price_mismatch when the two disagree instead of picking one quietly. Fifteen further items matched 15 of 15 on price and grade.

Thirteen storefronts, three catalogues, one EUR price list

Asking each of MPB's own thirteen market codes for its own stock in one run: the UK catalogue returned 19,841 live items, the US catalogue 34,197, the European catalogue 34,962, and the ten remaining codes each returned zero. That is not a gap in our reading: MPB's own storefront rewrites every European market to the shared European catalogue before it searches, so Germany, France, Italy, Spain, Portugal, the Netherlands, Austria, Ireland and both Belgian storefronts share one catalogue and one EUR price list. All thirteen codes are accepted, meta.catalog reports which one answered, and the model name, category and gear type come back in that market's language.

Filter values are the same English spellings in every market

MPB's index localises its own filter fields, so the value that matches 3,032 items in English matched zero when the same request was sent in German. Passing English values with a non-English storefront would have returned a silent, honest-looking empty result. The API avoids that by querying in the catalogue's English vocabulary and asking for the localised names separately, so one published value list works for all thirteen markets while names still come back translated.

Every filter bites, measured against two controls

Against the whole UK catalogue (19,829) in one run: Canon 4,866, Canon plus Nikon 7,747, DSLR lenses 4,949, Prime Lens 1,783, Canon EF mount 2,639, Like new 3,452, Like new plus Excellent 12,943, under 200 GBP 9,232, over 1,000 GBP 2,325. Inside a second, narrower control of 918 mirrorless bodies the same filters gave 231, 401, 197, 728, 1 and 438, and Canon EF correctly gave 0 because no mirrorless body carries an EF mount. Four filter fields that MPB's own code lists are deliberately not offered, because the live index returns no values for them at all — a filter that cannot narrow anything is worse than no filter.

A sold sku is refused, even though MPB answers 200

A dead sku URL on mpb.com returns HTTP 200 and quietly renders the model page instead of an error, which an integration reading only the status code would treat as a successful result for the wrong product. The API detects that and returns NOT_FOUND. A keyword with no matches is the opposite case and is passed through honestly: ok, zero rows, and MPB's own total of zero.

Paging ends where the catalogue ends

Requesting the row after the end of a 19,839-item catalogue, and a position far past it, both returned an empty page with MPB's own total rather than silently repeating the last page. meta.pagination carries the page, the page size, MPB's own match count and whether another page exists, so a crawl knows when to stop. page_size runs from 1 to 100.

There is no seller, because MPB is the seller

MPB buys gear in, inspects and grades it in its own hubs and resells it with its own warranty, so the public item page carries no third-party merchant, no seller profile and no seller rating. Nothing is masked here; there is no seller entity on this source to publish. What stands in its place is MPB's own grade, its written definition of that grade, and its per-item inspection notes.

What MPB does not publish on this surface

No serial number, no GTIN or EAN, and no stated warranty length in the item payload. What identifies an item is MPB's own stock number, and what describes its state is the grade, the usage counter, the accessory checklist and the inspection notes. The accessory checklist thins out where there is nothing to include: it was filled on 24 of 24 bodies, lenses, camcorders and drones but only 4 of 24 batteries and chargers.

What people build with MPB

The jobs this data is most often used for.

6

endpoints

1/2/3

credits per call

01

Price used bodies by shutter wear: pull every live copy of one camera with its grade, its shutter count and its price in a single call, and see what 250,000 actuations costs against 25,000 on the same model.

02

Track the second-hand camera market across the UK, the US and Europe: the same model, the same grade, three currencies, with MPB's own stock counts and price bands per model.

03

Build a buying guide or deal alert for photographers: filter by lens mount and grade, set a budget, and get the exact items in stock with their inspection notes and what is in the box.

04

Benchmark your own trade-in or resale pricing against a graded reference market, where every comparable is one physical item with a published grade, usage counter and accessory list rather than an average.

What MPB data costs

The cheapest call here is 1 credit, so $15/mo (Pro) buys 10,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 438 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/mpb/v1/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"query":"canon eos r6","market":"UK","sort":"price_asc"}'
python
import requests

r = requests.post(
    "https://api.reefapi.com/mpb/v1/search",
    headers={"x-api-key": REEF_KEY},
    json={
  "query": "canon eos r6",
  "market": "UK",
  "sort": "price_asc"
},
)
print(r.json()["data"])
FAQ

Have a question? We got answers.

The questions people actually ask before wiring up MPB.

Get a free key →
Do I get the shutter count?▾

Yes, as a separate field, never buried in a description. MPB publishes one usage counter per class of gear and the API returns all three as their own fields: shutter_count on bodies, hour_count on camcorders, battery_charge_count on drones. Measured over 24 rows per group: shutter_count was filled 24 of 24 on professional DSLR bodies and 0 of 24 on prime lenses, hour_count 23 of 24 on camcorders, battery_charge_count 24 of 24 on drones. A null means MPB publishes no counter for that kind of item, not that we dropped it. The product action also returns the firmware version where MPB records it.

How is the condition returned, and can I sort on it?▾

Three ways on every row. condition is the source's own code (LIKE_NEW, EXCELLENT, GOOD, WELL_USED, HEAVILY_USED, NEW, SPARES_OR_REPAIRS), condition_label is MPB's own display name for it, and condition_rank is MPB's own star rating as a number from 0 to 6 — the same number MPB's storefront filters on — so you can sort, compare and threshold on it without mapping anything yourself. The product action adds condition_description, MPB's own written definition of that grade, in the language of the market you asked for.

Does MPB say what is wrong with a specific item?▾

Yes, and the API returns it. When MPB's inspection finds something it publishes a note with its own code, the area, a short summary and a full explanation — for example 'Damaged rubber grips / The rubber grip shows signs of wear, but this is just cosmetic', 'Damage to hot shoe / Hot shoe mount has signs of corrosion, but is in full working order', or 'Sensor damage / There's a mark on the sensor filter, but this doesn't affect images'. The product action returns these as observations, one object per finding. A clean item returns none, which is itself the answer. Of 15 items sampled across five gear groups, 4 carried one or two notes.

Do I know what is in the box?▾

Yes. Search rows carry included_accessories, the list of accessories physically present with that item as MPB lists them (battery, charger, body cap, eyecup, lens hood and so on). The product action upgrades it to MPB's full checklist with a present flag per accessory, so you can tell a body sold with its charger from one sold without. Measured fill: 24 of 24 on bodies, lenses, camcorders and drones; 4 of 24 on batteries and chargers, where there is nothing to include.

Which markets and currencies?▾

Thirteen MPB storefronts over three real catalogues, measured in one run: the UK catalogue in GBP (19,841 live items), the US catalogue in USD (34,197) and one shared European catalogue in EUR (34,962). The German, French, Italian, Spanish, Portuguese, Dutch, Austrian, Irish and both Belgian storefronts all read that single EU catalogue and the same EUR price list — asking any of those ten market codes for its own separate stock returns zero, because MPB's own storefront rewrites them to the European catalogue before it searches. The API accepts all thirteen codes, reports in meta.catalog which one it actually read, and returns the model name, category and gear type in that market's language.

Is the price the one on the page?▾

On the product action, yes — it is the product page's own price, cross-checked inside the same response against the decimal string the page prints, and any disagreement is published as price_mismatch rather than quietly resolved. A search row's price comes from MPB's search index instead, and we checked that index against the page on 24 items across all three catalogues and both price extremes: 23 agreed and one was stale by 250.00 EUR. So filter and discover with search, and call product when the exact live price is what you are paying on.

How do I know a filter actually did something?▾

Every response carries meta.total_results, MPB's own match count for your exact request, plus meta.filters_applied. Against the whole UK catalogue (19,829) in one run: Canon 4,866, Canon plus Nikon 7,747, DSLR lenses 4,949, prime lenses 1,783, Canon EF mount 2,639, like new 3,452, like new plus excellent 12,943, under 200 GBP 9,232, over 1,000 GBP 2,325. Inside a narrower scope of 918 mirrorless bodies the same filters gave 231, 401, 197, 728, 1 and 438 — and Canon EF correctly gave 0, because no mirrorless body carries an EF mount. Four filter fields that MPB's own code lists are deliberately not offered, because the live index returns no values for them at all.

How do I find the right filter value instead of guessing?▾

Call facets. It returns MPB's own live taxonomy for the market you ask about — every brand, category, gear type, lens mount and grade that has stock right now, each with MPB's own count — and every value it returns is a value search accepts. It also takes the same filters as search, so you can ask for the taxonomy inside a scope, such as which lens mounts are available under Fujifilm. The values are the same English spellings in all thirteen markets, so one integration works everywhere.

Can I get every copy of one camera and compare grades?▾

That is what the model action is for. Give it a model id or the model slug and it returns the model record with its full spec sheet and the accessories MPB expects in the box, plus every live graded copy in that market with its sku, grade, usage count and price, cheapest first. On the Canon EOS R6 in the UK that was 57 items in stock. The models action does the same thing one level up: the UK catalogue's 19,839 items roll up to 3,866 models, each with its live in-stock count and price band.

Is there a seller to read?▾

No, and that is the nature of this source rather than something removed. MPB buys the gear, inspects it and sells it itself, so there is no third-party merchant, seller profile or seller rating anywhere on the page — the warranty and the grade are MPB's own. Nothing is masked here; there is simply no seller entity to publish.

How deep does paging go?▾

To the real end of the catalogue, honestly. Asking past the last page returns an empty page with MPB's own total, not a silent repeat of the last page — verified by requesting the row after the end of a 19,839-item catalogue and a position far past it. page_size runs from 1 to 100; meta.pagination carries the page, the page size, MPB's total and whether another page exists.

What happens with a sku that has already sold?▾

You get NOT_FOUND. This matters here because MPB's own URL does not: a dead sku answers HTTP 200 and quietly renders the model page instead, which a naive integration would read as a successful result for the wrong product. The API detects that and refuses it. A keyword with no matches is different — it returns ok with zero rows and MPB's own total of zero, because an empty answer is an answer.

What is the MPB API?▾

MPB API is a ReefAPI endpoint group for used cameras, lenses and cine kit from mpb.com as json: every item with mpb's own cosmetic grade, its shutter, hour or battery-charge count, what is in the box and its uk, us or eur price. It returns live JSON through POST requests under /mpb/v1.

Is the MPB API free to try?▾

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

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 437 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-10-07.