Start with the boundary
Move the capture only if the smaller contract fits.
Latchshot is deliberately narrower than ScreenshotOne. The migration is straightforward when the job is “load this public URL at a bounded viewport and return an artifact.” It is the wrong move when the provider is also modifying the page, bypassing access controls, storing the result, or orchestrating a workflow.
Good migration candidate
One public URL, one binary response.
- Input
- A public HTTP or HTTPS page on port 80 or 443
- Controls
- Viewport, scale, full page, wait strategy, short delay, dark mode, output format, and bounded cleanup
- Output
- PNG, JPEG, or PDF bytes returned synchronously
Keep the current provider
The provider does more than capture.
- Page changes
- Chat blocking, custom or exhaustive filter lists, selectors, or injected CSS/JavaScript are required
- Delivery
- Async execution, webhooks, CDN caching, S3 upload, or a provider-hosted artifact URL
- Reach
- Proxy geography, custom cookies or headers, authenticated pages, or private destinations
ScreenshotOne is a product of its respective owner. This page describes request concepts for migration planning. Confirm the current ScreenshotOne option documentation for the exact contract your application uses.
Move the key, then rename the options.
The material security change is authentication. ScreenshotOne commonly receives an access key as a query parameter. Latchshot requires the key in an HTTPS Bearer header and does not accept it in the target URL or request query.
Before: synchronous ScreenshotOne request
curl -fSLo before.png \
"https://api.screenshotone.com/take?access_key=$SCREENSHOTONE_ACCESS_KEY&url=https%3A%2F%2Fexample.com&viewport_width=1440&viewport_height=900&full_page=false&format=png"
After: synchronous Latchshot request
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,
"fullPage": false,
"blockAds": true,
"blockTrackers": true,
"hideCookieBanners": true
}' \
-o after.png
Keep secrets in the runtime's credential store or environment. Do not copy a previous query-string key into logs, exported workflows, browser code, or a Latchshot target URL.
Translate only the controls you use.
Do not mechanically copy an entire ScreenshotOne options object. Start with the smallest request that produces the required artifact, then add one control at a time and compare representative pages.
| ScreenshotOne concept | Latchshot | Migration note |
|---|---|---|
access_key | Authorization: Bearer … | Move the secret from the query into the request header. |
url | url | Public HTTP(S) only; private and special-use destinations are rejected. |
viewport_width | width | 320–2560 pixels. |
viewport_height | height | 240–1440 pixels. |
device_scale_factor | scale | Use 1 or 2. |
format=png | kind=screenshot, format=png | Binary PNG response. |
format=jpg/jpeg | kind=screenshot, format=jpeg | Latchshot uses the value jpeg. |
image_quality | quality | JPEG only; both accept integers from 1–100. Latchshot defaults to 85. |
format=pdf | kind=pdf | Choose A4, Letter, or Legal paper and optional landscape; omit screenshot format. |
full_page | fullPage | Boolean; validate tall-page output and storage size before cutover. |
scroll_page or full_page_scroll | scrollPage | Requires fullPage=true. Latchshot uses one deterministic sweep capped at 48 steps, 5 seconds, and 20,000 pixels; it does not expose custom scrolling actions. |
wait_until | waitUntil | Choose load, domcontentloaded, or networkidle; retest rather than copying an unsupported value. |
delay in seconds | delay in milliseconds | Convert the unit; for example, 2 seconds becomes 2000. Latchshot caps delay at 3000 ms. |
timeout in seconds | timeout in milliseconds | Convert the unit and keep it between 3000 and 30000 ms. |
dark_mode | darkMode | Boolean media preference, not a guarantee that the page has a dark theme. |
reduced_motion | reducedMotion | Boolean; defaults to true in Latchshot for stable artifacts. |
block_ads | blockAds | Best-effort blocking of requests to a bounded list of known third-party ad hosts; not a custom filter list or bypass. |
block_trackers | blockTrackers | Best-effort blocking of known third-party analytics and tracker hosts. Validate pages whose own scripts depend on a tag manager. |
block_chats | blockChats | Best-effort request blocking and selector hiding for known third-party chat widgets, not an exhaustive widget filter. |
block_cookie_banners | hideCookieBanners | Hides common consent overlays after load. Latchshot does not click consent or set consent cookies. |
block_banners_by_heuristics | hidePopups | Hides common newsletter, signup, and discount overlays. It does not click, submit, or promise all popups are recognized. |
On a narrow screen, scroll the option table horizontally.
GET /v1/screenshot accepts url, width, height, format, JPEG-only quality, fullPage, scrollPage, darkMode, and the five cleanup controls while still requiring Bearer authentication. Move to POST /v1/render for wait, delay, timeout, scale, reduced motion, or PDF controls.
Stop if these options carry the workload.
Latchshot has no equivalent for the following ScreenshotOne capabilities. Removing one can materially change the image or break the surrounding workflow.
- Page cleanup: custom or exhaustive ad/tracker/chat filter lists, popup handling beyond common known overlays, or any workflow that requires cleanup to be complete rather than best-effort.
- Element capture: selector screenshots, clip coordinates, click, hover, and element hiding.
- Page modification: injected CSS or JavaScript, HTML or Markdown input, and arbitrary request headers, cookies, or authorization.
- Network placement: country proxies, custom proxies, geolocation, private hosts, and non-standard target ports.
- Delivery orchestration: async jobs, webhooks, hosted artifact URLs, provider CDN caching, and direct S3 upload.
- Special outputs: WebP, AVIF, GIF, animation, metadata extraction, page HTML/Markdown, and provider-side vision analysis.
If one of these is required, keep ScreenshotOne for that job. A split-provider architecture is safer than silently degrading the result.
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 with evidence and a rollback.
- Inventory the exact options present in production requests; reject the migration if any required feature appears on the stop list.
- Create a representative set of public pages: ordinary, slow, animated, font-heavy, consent-banner, tall, and known-failure targets.
- Render the same fixed viewport and format through both providers. Compare image dimensions, visible content, fonts, navigation completion, and latency.
- Store Latchshot's
X-Latchshot-Render-Ms,X-Latchshot-Navigation,X-Latchshot-Fonts,X-Latchshot-Scripts, and quota headers with job diagnostics. - Route a bounded percentage of eligible jobs to Latchshot. Keep the previous provider configuration until the sample passes and rollback is exercised.
Retry only 429, 502, 503, and 504, with a strict attempt cap. Treat 400, 401, 403, and target-policy failures as permanent until the request changes.
Compare successful output, not headline quota.
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.
Those prices are inputs, not proof that Latchshot is cheaper for your workload. Include the captures that cannot migrate, output storage, transfer, retry volume, integration work, and the operational value of the features on the stop list.
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 spend the 100 monthly successful renders on a representative comparison set.
Test the eligible slice.
Use a recurring Free-plan key for synchronous captures of public pages. Keep ScreenshotOne anywhere the stop-list features remain necessary.