Some questions about a website are easier to answer by looking at it than by parsing it: what does this company do, does the page look broken, is there a newsletter popup, what plans are on the pricing page, does this look like a scam? Vision models answer them well from a screenshot. With your OpenAI key, the screenshot goes to the model in the same request, and the answer comes back with it.
Ask a question about a page
curl -X POST "https://shotkit.net/api/take" \
-H "X-Access-Key: YOUR_ACCESS_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com","response_type":"json","block_cookie_banners":true,"openai_api_key":"sk-YOUR_OPENAI_KEY","vision_prompt":"In one sentence: what does this company sell, and to whom?","vision_max_tokens":80}' \
--fail-with-body -o shot.json{
"screenshot_url": "https://shotkit.net/cdn/files/…/….jpg",
"vision": { "completion": "Example sells project management software to small engineering teams." }
}Your key is used for that request and never stored. OpenAI bills you directly for the tokens.
Classify sites in bulk
Ask for a fixed set of answers so results are easy to store and filter, for lead scoring, directory categories or content moderation:
curl -X POST "https://shotkit.net/api/take" \
-H "X-Access-Key: YOUR_ACCESS_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com","response_type":"json","image_width":1024,"openai_api_key":"sk-YOUR_OPENAI_KEY","vision_prompt":"Reply with JSON only: {\"category\": one of [saas, ecommerce, agency, media, nonprofit, other], \"has_pricing_link\": true or false, \"looks_professional\": 1 to 5}","vision_max_tokens":60}' \
--fail-with-body -o shot.jsonimage_width scales the screenshot down before sending it, which lowers token costs with little loss for questions like these.
Visual QA
Models notice what tests miss: overlapping text, a hero image that didn't load, a popup covering the page, an empty pricing table.
curl -X POST "https://shotkit.net/api/take" \
-H "X-Access-Key: YOUR_ACCESS_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://preview-1234.example.com","response_type":"json","full_page":true,"openai_api_key":"sk-YOUR_OPENAI_KEY","vision_prompt":"List any visual defects on this page: overlapping or cut-off text, broken images, empty sections, popups covering content. Reply '\''none'\'' if there are none.","vision_max_tokens":200}' \
--fail-with-body -o shot.jsonUse any model you like
The built-in call uses OpenAI. To use Claude, Gemini or a local model, take the screenshot (and the page as Markdown, if useful) with response_type=json and send it to your model yourself. Text plus image is often the best input: the Markdown for exact words and numbers, the image for layout and visual cues. See website to Markdown.
Frequently asked questions
Which OpenAI model is used?
A fast, low-cost vision model by default. You can't pick the model per request; to use a different model, send the screenshot to it yourself.
Is my OpenAI key stored?
No. It's used for the one request and never saved or logged. OpenAI errors fail the request with vision_error.
When should I use Markdown instead of vision?
For exact text, such as prices, names or article content, Markdown is cheaper and more precise. For layout, design, visual defects and "what is this?" questions, use vision. Many pipelines use both.