KEH APIkeh.com ↗
Search KEH.com's used camera inventory via API. Filter by brand, grade, price, and category. Returns pricing, availability, and condition grades.
What is the KEH API?
The KEH Camera API provides 2 endpoints for searching and browsing KEH's used photography equipment inventory. The search_products endpoint returns paginated product listings with up to 9 fields per item — including condition grade, price range, manufacturer, and stock quantity — while the suggest endpoint delivers query, product, and category autocomplete suggestions for a given partial search term.
curl -X GET 'https://api.parse.bot/scraper/665fddb5-5793-4f04-b3cf-87b1b256054d/search_products?sort=min_price+asc&brand=Sony&query=camera&page_size=5&page=1&grade=Like+New&category=8258&max_price=2000&min_price=100&product_type=Bodies&in_stock_only=true' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace keh-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
from parse_apis.keh_camera_search_api import KEH, Product, Suggestion, Sort
keh = KEH()
# Search for Sony cameras sorted by price low to high
for product in keh.catalogs.search(query="sony mirrorless", sort=Sort.PRICE_LOW_HIGH, limit=5):
print(product.title, product.min_price, product.manufacturer, product.quantity_available)
# Get autocomplete suggestions for a search term
suggestion = keh.suggestions.get(query="leica")
print(suggestion.query, len(suggestion.query_suggestions))
for ps in suggestion.product_suggestions:
print(ps.title, ps.min_price, ps.in_stock)
for cat in suggestion.category_suggestions:
print(cat.name, cat.id)
Search for used cameras, lenses, and photography equipment. Supports filtering by brand, grade, product type, price range, and sorting options. Returns paginated results with product details including pricing, condition grades, and availability. When category is provided, performs a category browse instead of keyword search. Paginates via page number; each product exposes grades as an array of available condition levels.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number (1-based) |
| sort | string | Sort order. Accepted values: 'min_price asc' (Price Low-High), 'min_price desc' (Price High-Low), 'title asc' (Name A-Z), 'title desc' (Name Z-A), 'pid desc' (Newest). Omit for relevance sorting. |
| brand | string | Filter by brand name (e.g., 'Canon', 'Nikon', 'Sony', 'Leica', 'Fuji') |
| grade | string | Filter by condition grade (e.g., 'Like New', 'Like New Minus', 'Excellent Plus', 'Excellent', 'Bargain', 'Ugly') |
| query | string | Search keyword (e.g., 'camera', 'mirrorless camera', 'canon lens', 'nikon') |
| category | string | Category ID to browse (e.g., '8258' for Used Cameras, '8226' for Used Camera Lenses). When provided, overrides keyword search. |
| max_price | string | Maximum price filter in USD |
| min_price | string | Minimum price filter in USD |
| page_size | integer | Number of results per page (1-100) |
| product_type | string | Filter by product type (e.g., 'Bodies', 'Fixed-Lens Cameras', 'Point & Shoots', 'Fixed Focal Length Lenses, Mfg') |
| in_stock_only | string | Filter to in-stock items only. Accepted values: 'true', 'false'. |
{
"type": "object",
"fields": {
"page": "integer - current page number",
"query": "string - the search query or category ID used",
"products": "array of product objects with id, title, url, image, image_webp, min_price, max_price, quantity_available, manufacturer, grades, product_type, system, lens_type, film_type, badges, specials",
"page_size": "integer - results per page",
"total_pages": "integer - total number of pages",
"total_results": "integer - total matching products"
},
"sample": {
"data": {
"page": 1,
"query": "camera",
"products": [
{
"id": "389898",
"url": "https://www.keh.com/shop/28203931.html",
"image": "https://cgi.keh.com/media/catalog/product/3/8/389898-4192460_01_r370x.jpg",
"title": "Canon EOS R50 Mirrorless Camera, Black {24.2MP}",
"badges": [
"Savings3"
],
"grades": [
"Excellent Plus",
"Excellent",
"Like New Minus"
],
"system": "Canon R Mirrorless",
"specials": [
"Best Sellers",
"Featured Products",
"Savings3"
],
"film_type": [],
"lens_type": [],
"max_price": 658,
"min_price": 633,
"image_webp": "https://cgi.keh.com/media/catalog/product/3/8/389898-4192460_01_r370x.webp",
"manufacturer": "Canon",
"product_type": "Bodies",
"quantity_available": 69
}
],
"page_size": 5,
"total_pages": 1133,
"total_results": 5663
},
"status": "success"
}
}About the KEH API
Search Products
The search_products endpoint accepts a query string alongside a full set of filters: brand (e.g., Canon, Nikon, Leica), grade (e.g., Like New, Excellent Plus, Bargain), min_price and max_price in USD, and a category ID to browse specific sections of the catalog such as Used Cameras (8258) or Used Camera Lenses (8226). When category is supplied, it overrides keyword-based query matching. Results are sorted via the sort parameter — options include min_price asc, min_price desc, and title asc — and paginated with page, page_size, total_pages, and total_results fields in every response.
Product Response Shape
Each item in the products array includes id, title, url, image, image_webp, min_price, max_price, quantity_available, manufacturer, and grades. The grades field reflects KEH's condition grading system, which ranges from Like New down to Bargain and Ugly, giving you the full spread of available conditions for a given item rather than a single rolled-up state.
Autocomplete Suggestions
The suggest endpoint takes a partial query string and returns three typed suggestion arrays: query_suggestions (search term strings), product_suggestions (with id, title, url, image, min_price, max_price, and in_stock), and category_suggestions (with name and id). This makes it straightforward to build a type-ahead search interface that surfaces both matching products and relevant catalog categories before a full search is issued.
The KEH API is a managed, monitored endpoint for keh.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when keh.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official keh.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Track price movements on specific used camera bodies across KEH's inventory by polling
search_productswith aqueryand recordingmin_price/max_priceover time. - Build a used gear price comparison tool by querying the same lens model across multiple
brandfilters and comparing returnedmin_pricevalues. - Populate a type-ahead search bar for a photography marketplace using
suggestwith partial brand or model strings. - Alert users when a specific condition grade (e.g.,
Like New) becomes available for a searched item by monitoringquantity_availableinsearch_productsresults. - Browse KEH's full category tree programmatically by supplying known
categoryIDs and paginating through results usingtotal_pages. - Filter used equipment by budget by combining
min_priceandmax_priceparameters to surface only gear within a target spend range. - Aggregate inventory counts across brands by iterating
brandvalues and summingtotal_resultsfor each.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does KEH Camera have an official developer API?+
What condition grades does `search_products` support for filtering?+
grade parameter accepts values from KEH's own grading scale: Like New, Like New Minus, Excellent Plus, Excellent, Bargain, and Ugly. Each product in the response also returns a grades field listing all condition tiers currently in stock for that item, so you can see the full availability spread rather than a single grade.Does the API return individual product detail pages or seller information?+
How does pagination work in `search_products`?+
page (current page, 1-based), page_size (results per page), total_pages, and total_results. Increment the page parameter to walk through subsequent result pages. There is no cursor-based pagination; only integer page numbers are supported.