bhphotovideo.com API: Search B&H Photo products
Searches B&H Photo products by keywords, with optional price range and sort order, and returns prices, savings, stock, ratings, identifiers, images and links in site order. Exact category names fall back to phrase matching to show products.
Unofficial. Not affiliated with or endorsed by bhphotovideo.com.
Inputs
Values from the run on Oct 31, 2026, shown under Output.
- Sort optional
sort Product order, for example price_low_to_high.
price_low_to_high
One of
best_match,price_low_to_high,price_high_to_low,top_rated,newest. Defaultbest_match.- Query, required
query Words to search for, such as mirrorless camera.
Sony headphones
- Max Price optional
max_price Highest price in USD, for example 1500.
350
Number 0 or more.
- Min Price optional
min_price Lowest price in USD, for example 500.
100
Number 0 or more.
- Max Results optional
max_results Maximum products to return, for example 24.
32
Whole number from 1 to 60. Default
24.
Input as JSON
{ "sort": "price_low_to_high", "query": "Sony headphones", "max_price": 350, "min_price": 100, "max_results": 32}Output
{ "products": [ { "name": "Sony MDR-7506 Headphones", "brand": "Sony", "price": 113, "currency": "USD", "bh_number": "SOMDR7506", "image_link": "https://static.bhphoto.com/images/images345x345/1317204371_49510.jpg" , "star_rating": 4.7, "availability": "In Stock", "product_link": "https://www.bhphotovideo.com/c/product/49510-REG/Sony_MDR_7506_MDR_7506_Headphone.html" , "review_count": 1645, "instant_savings": null, "manufacturer_model_number": "MDR-7506" }, { "name": "Sony INZONE H3 Wired Headset (White)", "brand": "Sony", "price": 118, "currency": "USD", "bh_number": "SOMDRG300W", "image_link": "https://static.bhphoto.com/images/images345x345/1659461721_1720014.jpg" , "star_rating": 4.5, "availability": "In Stock", "product_link": "https://www.bhphotovideo.com/c/product/1720014-REG/sony_mdrg300_w_inzone_h3_wired_headset.html" , "review_count": 33, "instant_savings": null, "manufacturer_model_number": "MDRG300/W" }, { "name": "Sony ULT WEAR Wireless Over-Ear Noise-Canceling Headphones (Black)", "brand": "Sony", "price": 148, "currency": "USD", "bh_number": "SOWHULT900NB", "image_link": "https://static.bhphoto.com/images/images345x345/1714661420_1824830.jpg" , "star_rating": 3.8, "availability": "In Stock", "product_link": "https://www.bhphotovideo.com/c/product/1824830-REG/sony_whult900n_b_ult_wear_wireless_noise.html" , "review_count": 6, "instant_savings": 100, "manufacturer_model_number": "WHULT900N/B" } ]}Code
curl https://api.fous.com/v1/runs \ -H "Authorization: Bearer $FOUS_API_KEY" \ -H "Content-Type: application/json" \ -d '{"method":"bhphotovideo.com/search_products","input":{"sort":"price_low_to_high","query":"Sony headphones","max_price":350,"min_price":100,"max_results":32}}' # Save as fous.py, then run: python3 fous.pyimport json, os, timefrom urllib.error import HTTPErrorfrom urllib.request import Request, urlopenAPI = "https://api.fous.com/v1/runs" KEY = os.environ["FOUS_API_KEY"]HEADERS = { "Authorization": f"Bearer {KEY}", "Content-Type": "application/json" ,}def call(url, body=None): data = json.dumps(body).encode() if body else None request = Request(url, data, HEADERS) try: with urlopen(request, timeout=120) as r: return r.status, json.load(r) except HTTPError as error: message = json.load(error)["error"]["message"] raise RuntimeError(message) from errorstatus, run = call(API, { "method": "bhphotovideo.com/search_products" , "input": { "sort": "price_low_to_high", "query": "Sony headphones", "max_price": 350, "min_price": 100, "max_results": 32 }})# 202: still going after 30 s. Ask again until it ends.while status == 202: time.sleep(2) status, run = call(f"{API}/{run['id']}")print(json.dumps(run["data"], indent=2))// Save as fous.mjs, then run: node fous.mjsconst api = "https://api.fous.com/v1/runs" ;const headers = { Authorization: `Bearer ${process.env.FOUS_API_KEY}`, "Content-Type": "application/json" ,};let response = await fetch(api, { method: "POST", headers, body: JSON.stringify({ "method": "bhphotovideo.com/search_products" , "input": { "sort": "price_low_to_high", "query": "Sony headphones", "max_price": 350, "min_price": 100, "max_results": 32 } }), signal: AbortSignal.timeout(120_000),});let run = await response.json();// 202: still going after 30 s. Ask again until it ends.while (response.status === 202) { await new Promise((done) => setTimeout(done, 2_000)); response = await fetch(`${api}/${run.id}`, { headers }); run = await response.json();}if (!response.ok) throw new Error(run.error.message);console.log(run.data);# Connect your agent to Fous once, over MCP (Streamable HTTP):# https://api.fous.com/mcp# Set FOUS_API_KEY first: create a key at https://app.fous.com/keys.# Claude Codeclaude mcp add \ --scope user \ --transport http fous https://api.fous.com/mcp \ --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"# Codexcodex mcp add fous \ --url https://api.fous.com/mcp \ --bearer-token-env-var FOUS_API_KEY# Cursor, VS Code, Windsurf, Cline and morenpx -y add-mcp https://api.fous.com/mcp -g -n fous \ --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"# Then ask your agent:# "Use Fous to run bhphotovideo.com/search_products# with {"sort":"price_low_to_high","query":"Sony headphones","max_price":350,"min_price":100,"max_results":32}"Over HTTP, the answer’s data holds the output. A run still going after 30 seconds answers 202 with its id: ask GET /v1/runs/{id} until it ends.
Schema
Input schema
{ "type": "object", "required": [ "query" ], "properties": { "sort": { "enum": [ "best_match", "price_low_to_high", "price_high_to_low", "top_rated", "newest" ], "type": "string", "default": "best_match", "description": "Product order, for example price_low_to_high." }, "query": { "type": "string", "minLength": 1, "description": "Words to search for, such as mirrorless camera." }, "max_price": { "type": "number", "minimum": 0, "description": "Highest price in USD, for example 1500." }, "min_price": { "type": "number", "minimum": 0, "description": "Lowest price in USD, for example 500." }, "max_results": { "type": "integer", "default": 24, "maximum": 60, "minimum": 1, "description": "Maximum products to return, for example 24." } }}Output schema
{ "type": "object", "required": [ "products" ], "properties": { "products": { "type": "array", "items": { "type": "object", "required": [ "name", "brand", "price", "currency", "instant_savings", "availability", "star_rating", "review_count", "bh_number", "manufacturer_model_number", "image_link", "product_link" ], "properties": { "name": { "type": "string" }, "brand": { "type": [ "string", "null" ] }, "price": { "type": [ "number", "null" ], "description": "Current price in USD." }, "currency": { "enum": [ "USD" ], "type": "string" }, "bh_number": { "type": [ "string", "null" ] }, "image_link": { "type": [ "string", "null" ] }, "star_rating": { "type": [ "number", "null" ] }, "availability": { "type": [ "string", "null" ] }, "product_link": { "type": "string" }, "review_count": { "type": "integer" }, "instant_savings": { "type": [ "number", "null" ], "description": "Displayed savings in USD, or null if none." }, "manufacturer_model_number": { "type": [ "string", "null" ] } }, "additionalProperties": false } } }, "additionalProperties": false}- Price
- 1 credit per completed run (1¢ with pay as you go); failed runs are free.
- Method
bhphotovideo.com/search_products- Returns
- name, brand, price, savings, availability, rating, review count, B&H and manufacturer numbers, image, link
Use it from your agent
Give your agent this line. It reads SKILL.md, gets a Fous API key and connects the Fous MCP server. Its run then takes the method bhphotovideo.com/search_products with the inputs above.
Ask your agent
- Find mirrorless cameras on B&H Photo between $800 and $1,500, cheapest first
- What are the top-rated shotgun microphones under $300 right now? Show me ratings and review counts.
- Look up the newest 70-200mm f/2.8 lenses at bhphotovideo.com and tell me which are in stock
- I need a list of 10 portable SSDs under $150 with their prices, any savings, and manufacturer part numbers
- Show the most expensive cinema camera bodies available, sorted high to low, limit to 15 results
See more
All bhphotovideo.com methodsGets a B&H Photo product's details by name, product link, or B&H number. A name uses the best matching search result; details and prices reflect the public page.
bhphotovideo.com/get_productSearches Best Buy US products with an optional price range, sort order and page. Prices and availability come from public listings and may vary by location.
bestbuy.com/search_productsSearches Newegg US for computer parts and electronics, with optional USD price range, seller restriction and sorting. Returns products in the order shown on the results page.
newegg.com/search_productsSearches Macy's products in the site's order with optional USD price bounds, sale-only results and sorting. Prices for products with a range use the lowest shown price.
macys.com/search_productsSearches Sephora US beauty products in Sephora's order, with brand and USD price filters and shopper sort options. Loves counts are null when a product page cannot be loaded.
sephora.com/search_productsSearches Kohl's products in site order and returns prices, offers, ratings and links for each result.
kohls.com/search_productsSearch Chewy products by words, pet type, and sort order. Returns up to 72 products in Chewy's order, including listed and first-order Autoship prices when shown.
chewy.com/search_productsSearches Flipkart products by keyword, with an optional price range and sort order. Returns current listings in site order.
flipkart.com/search_products