
CJ Dropshipping Scraper
scrape.ly/store/shelfbright/cj-dropshipping-scraperE-commerce
2 monthly users

Scrape B&H Photo Video products from category, search, deals and product pages or keywords: prices, savings, real stock status, ratings, reviews, images, SKU, MPN, key features, and optionally UPC, specs and box contents.
Turn any B&H Photo Video category, search or deals page into a clean spreadsheet of products: prices, regular prices and savings, real stock status, ratings, reviews, images, SKU, B&H # and MFR # numbers, key features and category paths. Paste a URL or type a keyword and get 1,000 products in well under a minute, with no login and no setup, for $0.75 per 1,000 products.
| Field | What it does |
|---|---|
startUrls | Category (/c/buy/...), search (/c/search?q=...), deals, brand or product (/c/product/...) URLs of bhphotovideo.com |
searchTerms | Keywords, one search each |
maxItems | Products to save in total (0 = no limit) |
sort | The site's sort orders: featured, best sellers, price, rating, newest, top deals... |
minPrice, maxPrice, minRating, brands, inStockOnly, onSaleOnly | Filters; only matching products are saved and charged |
includeDetails | Open each product page for UPC, specs, box contents, overview and videos |
maxItemsPerSource | Optional cap per URL or keyword |
proxyConfiguration | US residential proxies by default (the site refuses datacenter connections) |
{
"startUrls": [{ "url": "https://www.bhphotovideo.com/c/buy/Digital-Cameras/ci/9811/N/4288586282" }],
"searchTerms": ["sony fe lens"],
"maxItems": 200,
"sort": "BEST_SELLERS",
"minPrice": 500,
"inStockOnly": true
}
One row per product. The main fields:
| Field | Description |
|---|---|
name, brand, brand_series_model | Product name, brand, series and model |
price, price_strikethrough, price_savings, savings_percent | Current price, regular price and instant savings (USD) |
in_stock, stock_availability, stock_message | Stock status as the store shows it |
rating, reviews | Average rating and review count |
sku, bhId, mpn, item_source | B&H SKU, B&H #, manufacturer part number, new/used/refurbished source |
category, category_path | Listing category and the product's category breadcrumb |
featured_image, images | Main image and gallery images |
selling_points | Key features |
used_price, rebates, shipping_message, financing_message, badge | Offers around the product |
url, bitly_url | Product page and B&H short link |
position, page, search_term, source_url, scraped_at | Where and when the product was found |
upc, key_specs, specifications, in_the_box, overview, videos | With Include product details or product URLs |
Raw objects from the site (buying_options, quantity, shipping, store_info, financing, flags, condition_flags, notes) are included too, for anyone who needs every detail.
Example (from a real run, trimmed):
{
"name": "Canon EOS R6 Mark II Mirrorless Camera",
"brand": "Canon",
"price": 1999,
"currency": "USD",
"price_strikethrough": 2299,
"price_savings": 300,
"savings_percent": 13,
"category": "Digital Cameras",
"category_path": [
{ "id": 9811, "name": "Digital Cameras", "url": "https://www.bhphotovideo.com/c/buy/Digital-Cameras/ci/9811/N/4288586282" },
{ "id": 16158, "name": "Mirrorless Cameras", "url": "https://www.bhphotovideo.com/c/buy/Mirrorless-Cameras/ci/16158/N/4288586281" }
],
"in_stock": true,
"stock_availability": "in_stock",
"stock_message": "In Stock",
"reviews": 478,
"rating": 4.7,
"featured_image": "https://www.bhphotovideo.com/images/fb/canon_eos_r6_mark_ii_1733214.jpg",
"url": "https://www.bhphotovideo.com/c/product/1733214-REG/canon_eos_r6_mark_ii.html",
"sku": 1733214,
"item_source": "REG",
"bhId": "CAER62",
"mpn": "5666C002",
"brand_series_model": "Canon EOS R6 Mark II",
"selling_points": ["24.2MP Full-Frame CMOS Sensor", "4K60 10-Bit Internal Video, C-Log 3", "External 6K ProRes RAW Recording"],
"used_price": 1749.95,
"shipping_message": "FREE_NEXT_DAY",
"position": 2,
"page": 1,
"source_url": "https://www.bhphotovideo.com/c/buy/Digital-Cameras/ci/9811/N/4288586282",
"scraped_at": "2026-10-22T04:06:02.189Z"
}
With Include product details a row also has, for example:
{
"upc": "018208016952",
"key_specs": { "Lens Mount": "Nikon Z", "Effective Sensor Resolution": "45.7 Megapixel (8256 x 5504)", "Image Sensor": "Full-Frame" },
"in_the_box": ["Nikon Z8 Mirrorless Camera", "Nikon EN-EL15c Lithium-Ion Battery (2280mAh)", "Nikon MH-25a Battery Charger"],
"overview": "Built using flagship DNA, the Nikon Z8 is a compact, lightweight camera ..."
}
Example: 1,000 products from a category ≈ $0.75 + about $0.01 of usage.
Is it legal to scrape B&H Photo? The actor reads public product pages that anyone can open without an account. You are responsible for how you use the data and for following the site's terms and the laws that apply to you.
Do I need a login or my own proxy? No. No account is needed, and the actor uses US residential proxies by default because B&H refuses datacenter connections. If you pick other proxies and the site refuses them on every try, the actor switches to US residential proxies on its own.
How many products can I get? As many as the listings have: set Max products to 0 for everything. Each page holds 28 products and the actor follows the pages to the end. A search for "camera" alone lists over 60,000 products.
Why is a field empty?
Fields are empty when B&H does not show them for that product: no reviews yet, no sale price, a price that is only shown in the cart (price_map_message), or no UPC on the product page.
Why did my search return a category? For broad words (for example "camera" or "tripod") B&H sends you to a category landing page instead of a result list. The actor detects that and runs the same words as an exact-phrase search, so you still get products, and it says so in the run's status message.
Can I schedule it or use it from my code? Yes. Create a schedule in the console to run it daily or hourly, or start runs and read the dataset through the API.
Every field below can be set in the run form, passed through the API, or saved as a task. Unset fields fall back to the defaults shown.
startUrlsarrayOptionalB&H Photo URLs
Pages of bhphotovideo.com, copied from your browser: category pages (/c/buy/...), search result pages (/c/search?q=...), deals and other product lists, or product pages (/c/product/...). Sort and search filters in the URL are kept. Product pages always come back with full details. Top-level landing pages (/c/browse/..., such as a brand's home page) have no product list; the actor searches for their name instead.
searchTermsarrayOptionalSearch terms
Keywords to search for on B&H Photo, one per line, as you would type them into the site's search bar (for example "mirrorless camera", "Sony FE lens" or "video monitor"). Each keyword is its own search; all results land in the same dataset.
maxItemsintegerOptionaldefault 20Max products
How many products to save in total, across all URLs and keywords. 0 means no limit: every product of every listing.
Narrow the results. Filters apply to every URL and keyword; only matching products are saved and charged.
sortenumOptionalSort by
Order of the results, using the site's own sort options. Leave empty to keep the order of each URL (or relevance for keywords).
minPriceintegerOptionalMinimum price (USD)
Only save products that cost at least this much.
maxPriceintegerOptionalMaximum price (USD)
Only save products that cost at most this much. With 'Price: low to high' the actor stops paging once prices pass this value.
minRatingenumOptionalMinimum rating
Only save products with at least this average customer rating.
brandsarrayOptionalBrands
Only save products of these brands, for example "Canon" or "Sony" (case does not matter).
inStockOnlybooleanOptionaldefault falseIn stock only
Only save products the site shows as In Stock.
onSaleOnlybooleanOptionaldefault falseOn sale only
Only save products with an instant saving or a reduced price.
includeDetailsbooleanOptionaldefault falseInclude product details
Also open each product page for the UPC barcode, key specs, the full specification table, what is in the box, the editorial overview and product videos. Slower, and charged as a detailed product.
maxItemsPerSourceintegerOptionalMax products per URL or keyword
Cap for each URL and each keyword on its own, so that one large category does not use up 'Max products'. Leave empty or 0 for no per-source cap.
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["RESIDENTIA…Proxy configuration
B&H Photo refuses datacenter and cloud connections, so US residential proxies are used by default. If the chosen proxies are refused on every try, the actor switches to US residential proxies.
Every run writes its results to a dataset. Preview it in the dashboard, then export it or read it through the API.
| Field | Type | Description |
|---|---|---|
| name | string | null | Product name as listed on B&H Photo. |
| brand | string | null | Brand or manufacturer. |
| price | number | null | Current B&H price in US dollars; empty when the site hides it (call for price or price in cart). |
| currency | string | null | Currency of the prices (USD). |
| price_strikethrough | number | null | Crossed-out regular price when the product is on sale. |
| price_grayed | number | null | Grayed-out reference price when the site shows one. |
| price_savings | number | null | Instant savings in US dollars. |
| savings_percent | number | null | Savings as a percentage of the regular price. |
| price_map_message | string | null | Minimum advertised price message, when the price is only shown in the cart. |
| call_for_price | boolean | null | True when the site asks to call for the price. |
| category | string | null | Category of the listing page (or the product's own category for searches and product pages). |
| category_path | array | null | The product's category breadcrumb: id, name and URL of each level. |
| in_stock | boolean | null | True when B&H shows the product as In Stock. |
| stock_availability | string | null | Normalized availability: in_stock, out_of_stock, preorder, special_order, backordered, discontinued, unavailable. |
| stock_status | string | null | The site's stock status code (IN_STOCK, DYNAMIC...). |
| stock_message | string | null | Availability text the site shows (In Stock, Temporarily Out of Stock, New Item - Coming Soon...). |
| stock_description | string | null | Extra availability note when the site shows one. |
| reviews | number | null | Number of customer reviews. |
| rating | number | null | Average customer rating (0 to 5); empty without reviews. |
| featured_image | string | null | Main product image URL. |
| images | array | null | Product image URLs, largest available size. |
| description_text | string | null | Short product description (the listing title). |
| url | string | null | Product page on bhphotovideo.com. |
| bitly_url | string | null | B&H short link of the product. |
| sku | number | string | null | B&H SKU number. |
| item_source | string | null | REG for new items; USE, OBX, RFB and others for used, open-box and refurbished items. |
| bhId | string | null | B&H item code shown on the product page (B&H #). |
| mpn | string | null | Manufacturer part number. |
| brand_series_model | string | null | Brand, series and model label. |
| selling_points | array | null | Bullet-point selling points. |
| badge | string | null | Promotional badge on the listing, when present. |
| used_price | number | null | Price of a used copy B&H offers, when available. |
| shipping_message | string | null | Shipping offer code, e.g. FREE_EXPEDITED, FREE_TWO_DAY_DELIVERY. |
| store_pickup | string | null | Store pickup availability code. |
| financing_message | string | null | Promotional financing offer. |
| position | number | null | Position in the listing (1 = first). |
| page | number | null | Result page the product was found on. |
| search_term | string | null | Keyword that found the product (for searches). |
| source_url | string | null | Listing or product URL the product came from. |
| upc | string | null | UPC barcode (with product details). |
| key_specs | object | null | Key specifications (with product details). |
| specifications | object | null | Full specification table by group (with product details). |
| in_the_box | array | null | What is in the box (with product details). |
| overview | string | null | Editorial product overview (with product details). |
| videos | array | null | Product video URLs (with product details). |
| scraped_at | string | null | When the row was scraped (UTC, ISO 8601). |
You pay for the events the actor reports, such as each result or page it produces. Platform usage is included in the event prices.
| Event | Charged when | Price |
|---|---|---|
| Detailed product | One saved product with its product page (Include product details, or product URLs): everything in Product plus UPC barcode, key specs, the full specification table, what is in the box, the overview and product videos. Charged instead of Product, not on top. | $0.0015 |
| Product | One saved B&H Photo product from a category, search or deals listing: price, regular price and savings, stock status, rating, reviews, images, SKU, B&H #, MFR #, key features and category. | $0.00075 |
Run this actor from your own code. Swap in your API token and the examples work as-is.
import { ScrapelyClient } from 'scrapely-client'
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN })
// Start the actor and wait for the run to finish.
const run = await client.actor('shelfbright/bhphoto-scraper').call({
"startUrls": [
{
"url": "https://www.bhphotovideo.com/c/buy/Digital-Cameras/ci/9811/N/4288586282"
}
],
"maxItems": 20,
"proxyConfiguration": {
"useScrapelyProxy": true,
"scrapelyProxyGroups": [
"RESIDENTIAL"
],
"scrapelyProxyCountry": "US"
}
})
// Read the dataset the run produced.
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)Tokens live in your account settings. Keep them server-side: a token carries the full permissions of your account.
Connect the Scrape.ly MCP server once and your agent can run this actor as a tool. Pick your tool:
Fetch scrape.ly/agents.md and run shelfbright/bhphoto-scraperPaste into Claude Code, Codex, Cursor or any AI agent. It signs you in once in the browser.
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp?tools=actors,runs,storage,docs&actors=shelfbright/bhphoto-scraper"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
No examples yet
The developer hasn't published example inputs for this actor.

Scrape Google Maps places for any search term and city, with no code or with one API call. A real run, its output, its log and its exact cost, plus the limits and the legal side.
Read the article
Paste an Amazon search or product URL into a ready-made Actor and get one row per product with price, ASIN, rating and review count. This guide covers the no-code steps, the API, ZIP code pricing, a real run and its cost.
Read the article
Scrape Google search results by query and country and get each results page as JSON: organic results with positions, People Also Ask and related searches. Run it without code or from Python, with a real run, the cost per page and Google's terms.
Read the articleScrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.