Pricing API documentation
Market prices for used medical equipment, computed by Medical Price Online from listings across the major marketplaces and dealers, in JSON over HTTPS.
Getting started
- Create a free account and verify your email.
- Create a key in the Pricing API overview. The free plan includes 500 requests a month.
- Call the API from your server:
curl -H "Authorization: Bearer YOUR_KEY" "https://www.medicalpriceonline.com/api/v1/products/?q=logiq+e9&priced=1"
Authentication
Send your key in the Authorization header as Bearer YOUR_KEY on every request. Keys are secrets: use them only from your own servers, never in a web page or an app others can inspect. Revoke a key at once if it is exposed. Requests without a valid key get 401.
Limits
Each plan has a monthly allowance and a per-minute rate. See Plans. Every response carries:
X-Quota-Limit,X-Quota-Remaining,X-Quota-Reset: this month's allowance, what is left, and the last day of the month.X-RateLimit-Limit: requests allowed per minute.
Over a limit, requests get 429 with rate_limited (and a Retry-After header in seconds) or quota_exceeded. Refused requests are not counted. Requests that fail because of an error on our side are not counted either.
Errors
Errors are JSON: {"error": {"code": "...", "message": "..."}}.
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_parameter | A parameter is missing or malformed. |
| 401 | invalid_key | No key, an unknown key, or a revoked key. |
| 403 | account_suspended | The account is suspended. |
| 404 | not_found | No published product or category with that id or slug. |
| 429 | rate_limited, quota_exceeded | Over a limit. The body includes an upgrade_url. |
GET /api/v1/products/
Search the catalog of published products, 100 per page, ordered by id.
| Parameter | Meaning |
|---|---|
q | Words that must all appear in the product title. |
manufacturer | Manufacturer slug, for example ge. |
type | Product type slug, for example ultrasound. |
priced | 1 for products that have a price. |
updated_since | ISO 8601 date and time: products whose price was recomputed since then. Use it to sync incrementally. |
cursor | The next_cursor from the previous page. |
{
"data": [
{
"id": 1234,
"title": "GE Logiq E9",
"manufacturer": {"name": "GE", "slug": "ge"},
"category": {"name": "Imaging", "slug": "imaging"},
"type": {"name": "Ultrasound", "slug": "ultrasound"},
"price": 25000,
"currency": "USD",
"condition": "Used",
"location": "USA",
"sources": 14,
"price_updated": "2026-10-12T11:20:00+00:00",
"url": "https://medicalpriceonline.com/medical-equipment/ge/ge-logiq-e9/"
}
],
"next_cursor": "1234"
}
Example values are illustrative. price is null when a product has no market data; we never estimate.
GET /api/v1/products/{id}/
One product, with everything above plus range (the 10th to 90th percentile of the prices the price rests on, so a single mislabeled listing does not stretch it) and change_percent: the change from the monthly average 30, 90, and 365 days ago to the latest monthly average, or null when there is no average to compare.
GET /api/v1/products/{id}/history/
Monthly average asking price and the number of observations behind it, as far back as the data goes (2011 for some products): {"months": [{"month": "2026-09", "average": 24800, "samples": 6}, ...]}.
GET /api/v1/match/?title=…
Identify the product a free-text listing title refers to, the way Medical Price Online matches its own market data. Returns the product (as in Products) or null, the normalized text it searched, and the method:
prefix: the start of the title equals a product's name. The most reliable.words: a product's name contains every word of the title. Check these before relying on them.none: no match.
Titles are limited to 500 characters. Each call counts as one request.
GET /api/v1/categories/ and /api/v1/categories/{slug}/
For each product type with priced products: priced_products, median_price, and listings_last_90_days, the matched market listings seen in the last 90 days.
GET /api/v1/usage/
Your plan, requests today and this month, your limits, and when the monthly allowance resets. It counts as a request like any other.
How prices work
- A product's price is the average asking price of its market listings updated in the last 12 months, plus the listings on Medical Price Online itself, rounded to whole dollars.
- Listings for parts, rentals, auctions, and prices under $100 are left out.
sourcesis how many listings the price rests on. Treat a price with fewer than 3 sources as indicative.- Prices are asking prices, not completed sales, appraisals, or offers.
- Prices are recomputed every day.
Versions
This is version 1. We will give at least 90 days' notice before changing a field in a way that breaks existing integrations. A machine-readable description is coming as /api/v1/openapi.json.