Brands with a minimum advertised price (MAP) policy need to know when a retailer lists below it, and need proof when they contact them: a screenshot of the product page with the price, the URL and the time. Pricing teams tracking competitors and marketplaces need the same captures, at scale and on a schedule. A price you can't show is an argument; a dated screenshot settles it.
Capture a product page as evidence
curl -X POST "https://shotkit.net/api/take" \
-H "X-Access-Key: YOUR_ACCESS_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://retailer.example.com/products/acme-blender-x200","full_page":true,"format":"jpg","image_quality":85,"block_cookie_banners":true,"block_chats":true,"fail_if_content_missing":["Add to cart"],"response_type":"json","metadata_content":true,"metadata_content_format":"markdown","metadata_http_response_headers":true,"metadata_page_title":true}' \
--fail-with-body -o shot.jsonfail_if_content_missingmakes sure you captured a real product page, not an error, a captcha or a "not available" page. Failed requests don't count toward your quota.metadata_contentgives you the page as Markdown to read the price from, so the check is automatic and the screenshot is the evidence.metadata_http_response_headersrecords the server'sDateheader next to your own timestamp.
Read the price automatically
Narrow the capture to the price block with selector and parse it from the Markdown:
curl -X POST "https://shotkit.net/api/take" \
-H "X-Access-Key: YOUR_ACCESS_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://retailer.example.com/products/acme-blender-x200","format":"markdown","selector":"[itemprop=price], .price, [data-testid=price]"}' \
--fail-with-body -o shot.mdFlag a violation when the parsed price is below your MAP, and keep the full-page screenshot from the same run as the record.
Prices that vary by location
Retailers can show different prices by region, store or IP address. Use a proxy in the right country, geolocation_latitude and geolocation_longitude for store-specific prices, and time_zone for timed promotions. See geolocation and localization.
Keeping a record
Files on the CDN expire after cache_ttl (at most 30 days). For evidence, download each screenshot right away and store it with the URL, your capture time, the server's Date header and a SHA-256 hash of the file in storage you control. See website archiving.
Frequently asked questions
Will screenshots hold up as evidence?
That depends on your jurisdiction and purpose, and this isn't legal advice. A capture is much stronger with the original file, its hash, the capture time, the URL and the HTTP response headers stored together and unchanged.
What about retailers that block automated visitors?
Many product pages render normally. Some retailers use bot protection that shows a challenge; a custom user_agent or a residential proxy helps with some of them, and fail_if_content_missing keeps challenge pages out of your evidence.
How many products can I monitor?
Each check is one screenshot. 200 product pages checked daily is about 6,000 a month.