Add a screenshot and web page reader Action to a custom GPT

A custom GPT can't open a page in a real browser or show you what a site looks like. An Action can do both. This guide wires Shotmint into a GPT in about five minutes: one schema URL to import, one API key, and a short block of instructions. It also covers the limit that breaks most page-reading Actions: OpenAI caps every Action response at 100,000 characters, and long pages go well over that.

What the GPT gets

OperationWhat it does
content
GET /v1/content
Loads the page in Chromium (JavaScript pages work) and returns its main content as Markdown, with title, author, date and the page's own HTTP status. 1 credit.
screenshotSignedUrl
GET /v1/screenshot/url
Returns a public image URL that the GPT shows inline with Markdown. Free to request. The render happens when the image is first loaded (1 credit), and repeats are cached for 24 hours.
account
GET /v1/account
Credits left on the key, so the GPT can tell you when you're running low.

The schema at https://shotmint.creasework.com/openapi-gpt.json holds only these three operations, with one auth scheme and JSON responses. Actions can't show binary images, so the full /openapi.json (PNG and PDF responses, three auth schemes, 20+ operations) is the wrong file for a GPT.

Setup

  1. Get a key: free key (25 renders a month, no signup), or a paid pack if the GPT will be shared widely.
  2. In ChatGPT, open Explore GPTs > Create > Configure, scroll to Actions and click Create new action.
  3. Click Import from URL and paste https://shotmint.creasework.com/openapi-gpt.json. The three operations appear under Available actions.
  4. Under Authentication, pick API Key, auth type Custom, custom header name X-API-Key, and paste your key. (Auth type Bearer works too: the API accepts Authorization: Bearer as well.)
  5. For Privacy policy (needed to share the GPT publicly), use https://shotmint.creasework.com/privacy.
  6. Paste the instructions below into the GPT's Instructions box.
When the user gives a URL and wants to see it, call screenshotSignedUrl with that url
(add full_page=true for "whole page", mobile=true and width=390 for "on a phone",
dark_mode=true for "dark mode"). Show the result with Markdown: ![Screenshot](URL).
You can't see the image yourself, so don't describe its contents.

When the user wants a page read, summarised or quoted, call content with that url and
max_chars=50000. If status is not 200, say the site returned that status (404 page,
login or bot wall) instead of summarising it. If truncated is true, say you only read
the first part of the page.

The key stays in ChatGPT's Action settings. It never appears in the image URLs, which carry a key id and an HMAC signature instead.

The 100,000-character limit, measured

OpenAI's Actions production notes say request and response payloads must each be under 100,000 characters, and that requests time out after 45 seconds (checked 2026-10-25). We ran six real pages through /v1/content and counted the Markdown it returned:

PageMarkdown characters
GitHub: microsoft/playwright README11,551 (8,050 with links=false)
MDN: Using the Fetch API22,115 (14,749)
Python docs: Classes tutorial39,592 (34,668)
Wikipedia: Origami68,467 (38,479)
Wikipedia: Python (programming language)191,399: over the limit
Wikipedia: World War II424,717 (175,625): over the limit even without links

Two of the six would make the Action fail outright, and the JSON wrapper (escaped newlines and quotes, plus the metadata fields) adds to the count. That's why the GPT schema defaults max_chars to 50,000 and the instructions ask for it on every call: the content is cut at 50,000 characters, truncated comes back true, and the GPT can say it read only the first part. links=false drops link URLs and images, which cut the measured pages by 12% to 59%.

Test the calls before you build the GPT

These are the exact requests the Action sends. Run them with your key to see what the GPT will get:

curl -s "https://shotmint.creasework.com/v1/content?url=https://en.wikipedia.org/wiki/Python_(programming_language)&max_chars=50000" \
  -H "X-API-Key: YOUR_KEY" | head -c 600; echo

curl -s "https://shotmint.creasework.com/v1/screenshot/url?url=https://github.com/microsoft/playwright&full_page=true" \
  -H "X-API-Key: YOUR_KEY"

The second call returns {"url":"https://shotmint.creasework.com/s/....png?...&sig=...","key_id":"..."}. Open that URL in a browser: that's the image the GPT shows.

What we did and didn't run

We validated the schema with an OpenAPI 3.1 parser and ran every request above against the live API. The ChatGPT editor itself can't be scripted, so the import and chat steps above follow OpenAI's documented flow but weren't run by us. If something in the editor doesn't match, tell us. Claude, Cursor and other MCP clients don't need any of this: point them at the MCP server.

What it costs

Each page read or new screenshot is one credit, and repeat screenshots of the same URL within 24 hours are free. A free key covers 25 a month. For a GPT you share, €5 buys 2,000 renders with no subscription, and credits never expire.

Try it with 25 free renders a month

No signup, no card. Get a key in one click, then buy credits only if you need more (from €5 for 2,000, never expire). From a script, an AI agent, Make or Zapier, POST /v1/keys/free (no body) returns a key as JSON (openapi.json, no-code recipes).

Get a free API key Full API reference

More guides: Use cases

All guides: guides · integrations · comparisons