Start with the delivery contract
Move only the server-side image request.
ScreenshotMachine exposes an HTTP GET image URL that can be fetched by a backend or embedded directly in public HTML with an optional hash. It can also cache the result and modify page state before capture. Latchshot has a smaller contract: a trusted server sends one Bearer-authenticated JSON request and receives PNG, JPEG, or PDF bytes synchronously.
Good migration candidate
Your backend needs one image now.
- Input
- A public HTTP or HTTPS page on port 80 or 443
- Controls
- Explicit viewport, scale 1 or 2, full page, lifecycle wait, short delay, and PNG or JPEG output
- Output
- Image bytes returned to an authenticated server call
Keep ScreenshotMachine
The URL or browser setup matters.
- Delivery
- A signed image URL is embedded in HTML, or provider cache age controls freshness
- Browser work
- Device presets, GIF, zoom outside 100/200, clicks, hiding, cookies, language, or user agent is required
- Selection
- A DOM element, crop rectangle, fixed viewport taller than 1440px, or ScreenshotMachine-specific error image is consumed
ScreenshotMachine is a product of its respective owner. This page is a migration reference for the smaller Latchshot contract. Confirm the current ScreenshotMachine API documentation and parameters used by your application.
Move the key out of the image URL.
ScreenshotMachine accepts parameters in an HTTP GET URL and returns image bytes. Latchshot accepts JSON over POST, returns image bytes, and requires the key in an Authorization header. The target URL must include its scheme.
Before: ScreenshotMachine binary response
curl -sSL -G \
'https://api.screenshotmachine.com/' \
-d "key=$SCREENSHOTMACHINE_KEY" \
--data-urlencode 'url=https://example.com' \
-d 'dimension=1440x900' \
-d 'format=png' \
-d 'cacheLimit=0' \
-d 'delay=200' \
-o before.png
After: Latchshot binary response
curl -fSL \
'https://latchshot.fly.dev/v1/render' \
-H "Authorization: Bearer $LATCHSHOT_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
"url": "https://example.com",
"kind": "screenshot",
"format": "png",
"width": 1440,
"height": 900,
"delay": 200
}' \
-o after.png
ScreenshotMachine documents an error image plus X-Screenshotmachine-Response for invalid requests. Latchshot returns a non-2xx JSON error instead of an image. Check HTTP status and content type before treating the response as an artifact.
Translate dimensions and behavior explicitly.
The direct image response overlaps, but defaults, viewport limits, device behavior, caching, and failure shapes differ. Compare representative pages instead of assuming the same dimensions produce identical pixels.
| ScreenshotMachine concept | Latchshot | Migration note |
|---|---|---|
key query parameter | Authorization: Bearer … | Keep the replacement key out of URLs, client code, HTML, analytics, and logs. |
hash=md5(url + secret) | No URL credential | Move capture to a trusted server. Latchshot has no direct-image-link equivalent. |
| GET query | POST JSON | Change the request method/body and send Content-Type: application/json. |
url, scheme optional | url, scheme required | Supply the complete http:// or https:// URL. |
| Image response | Binary response | The closest delivery contract. Both callers should validate status, type, and bytes. |
| Error image plus response header | Non-2xx JSON error | Replace image/header inspection with HTTP-status and structured-error handling. |
dimension=1440x900 | width=1440, height=900 | Split the pair. Latchshot accepts width 320–2560 and viewport height 240–1440. |
Default 120x90 | Default 1440x900 | Set dimensions explicitly. Resize downstream for thumbnails below Latchshot's 320×240 minimum. |
dimension=1024xfull | width=1024, fullPage=true | Validate Latchshot's bounded 20,000px document height; add scrollPage=true only when viewport-triggered lazy content requires activation. |
| Fixed height above 1440px | No exact viewport equivalent | fullPage captures the document; it does not create an arbitrary tall fixed viewport. |
device=desktop | Explicit width and height | Closest default browser shape; compare responsive breakpoints. |
device=phone/tablet | No device preset | Viewport dimensions alone do not reproduce ScreenshotMachine's device/user-agent behavior. |
format=jpg/png | format=jpeg/png | Rename jpg to jpeg; set the format because defaults differ. |
format=gif | No exact equivalent | Keep ScreenshotMachine or convert a supported artifact downstream. |
cacheLimit in days | No provider cache | Build freshness, storage, and cache keys in your application if needed. |
delay in milliseconds | delay in milliseconds | The unit matches. Latchshot accepts 0–3000ms, not ScreenshotMachine's documented values through 10,000ms. |
zoom=100/200 | scale=1/2 | Closest pixel-density choices, not identical browser zoom semantics; retest layout and output dimensions. |
click, hide | No exact equivalent | Do not remove page cleanup or interaction silently. |
cookies, accept-language, user-agent | No exact equivalent | Keep ScreenshotMachine when the captured page depends on request state or device identity. |
selector, crop | No exact equivalent | Latchshot captures the viewport or full page, not one element or arbitrary rectangle. |
On a narrow screen, scroll the option table horizontally.
Stop if ScreenshotMachine supplies more than bytes.
Latchshot has no equivalent for these ScreenshotMachine capabilities. Removing one can change the response, page, delivery contract, quota behavior, or security model.
- Direct embedding: an API image URL placed in
<img src>, the MD5 URL hash/secret-phrase model, or any workflow that sends credentials through a URL. - Provider cache:
cacheLimit, cached-image age, provider refresh behavior, and economics that depend on cache reuse. - Browser identity: phone/tablet device presets, custom user agents, languages, and cookies.
- Page changes: selector clicks, hidden elements, cookie handling beyond best-effort common-overlay hiding, or any required interaction before capture.
- Selection and output: DOM-element capture, crop rectangles, GIF, arbitrary zoom, tiny thumbnails, or fixed viewports taller than 1440px.
- Error and PDF contracts: consumers that expect an error image/header or depend on ScreenshotMachine's separate website-to-PDF API without a fresh PDF-specific comparison.
Keep ScreenshotMachine for any job that needs those features. A split-provider design is safer than weakening an existing workflow to force a migration.
The fit check is free. Review the exact $99 pilot scope and acceptance boundary, then open a public migration-fit question on GitHub with the request contract, required provider behavior, and expected volume. For one eligible JavaScript/TypeScript or Python backend call site in a public GitHub repository you control, choose the optional $99 implementation pilot. API usage is separate. Never include a key, private or signed URL, customer data, or sensitive artifact.
Cut over one eligible job at a time.
- Inventory the exact ScreenshotMachine URL, including hash, cache, device, page-state, selection, output, and error handling.
- Reject every job that depends on the stop list. Do not treat a public
<img src>URL as a trusted server call. - Render a representative public-page set through both providers with explicit dimensions, formats, scale, waits, and freshness.
- Compare dimensions, visible content, responsive layout, fonts, navigation completion, latency, failure behavior, and downstream storage.
- Route a bounded share of eligible jobs to Latchshot and keep the ScreenshotMachine path until rollback has been exercised.
Retry only 429, 502, 503, and 504, with a strict attempt cap. Treat authentication, validation, and target-policy failures as permanent until the request changes.
Price the complete workflow.
Latchshot counts successful direct renders. Failed direct renders do not consume monthly quota, and automatic overages are disabled during the beta. The current plans are Free at 100 successful renders each UTC month, Launch at $19 for 2,500, Build at $49 for 12,000, and Scale at $149 for 50,000.
That is not proof that migration is cheaper. ScreenshotMachine can reuse provider-cached images according to cacheLimit. Include cache hit rate, downstream resizing or conversion, storage, transfer, engineering work, retries, and every ScreenshotMachine-only job that remains.
The reference run completed 197 of 200 preflighted public HTML roots at 2.42-second p50 and 7.68-second p95 end to end. It is engineering evidence, not an SLA or a prediction for your pages.
Create one Free-plan key, save it when it is returned, and use the 100 monthly successful renders on a representative eligible set.
Test the server-side slice.
Move only synchronous public-page PNG or JPEG captures whose trusted caller consumes bytes. Keep ScreenshotMachine wherever its image URL, cache, device, page-state, selection, or error behavior is part of the job.