Move from ScreenshotOne.

Latchshot can replace a narrow, common slice: synchronous PNG, JPEG, or PDF captures of public pages, with optional best-effort ad/tracker/chat blocking and common consent or newsletter/signup/discount overlay hiding. Check the stop list first. If the current request depends on custom or exhaustive blockers, selectors, scripts, proxies, hosted artifact URLs, or async webhooks, this is not a drop-in migration.

Provider migration reference · Public-page boundary · Updated July 19, 2026

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
Not affiliated with ScreenshotOne.

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

curlquery credential → PNG
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

curlBearer credential → PNG
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 conceptLatchshotMigration note
access_keyAuthorization: Bearer …Move the secret from the query into the request header.
urlurlPublic HTTP(S) only; private and special-use destinations are rejected.
viewport_widthwidth320–2560 pixels.
viewport_heightheight240–1440 pixels.
device_scale_factorscaleUse 1 or 2.
format=pngkind=screenshot, format=pngBinary PNG response.
format=jpg/jpegkind=screenshot, format=jpegLatchshot uses the value jpeg.
image_qualityqualityJPEG only; both accept integers from 1–100. Latchshot defaults to 85.
format=pdfkind=pdfChoose A4, Letter, or Legal paper and optional landscape; omit screenshot format.
full_pagefullPageBoolean; validate tall-page output and storage size before cutover.
scroll_page or full_page_scrollscrollPageRequires 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_untilwaitUntilChoose load, domcontentloaded, or networkidle; retest rather than copying an unsupported value.
delay in secondsdelay in millisecondsConvert the unit; for example, 2 seconds becomes 2000. Latchshot caps delay at 3000 ms.
timeout in secondstimeout in millisecondsConvert the unit and keep it between 3000 and 30000 ms.
dark_modedarkModeBoolean media preference, not a guarantee that the page has a dark theme.
reduced_motionreducedMotionBoolean; defaults to true in Latchshot for stable artifacts.
block_adsblockAdsBest-effort blocking of requests to a bounded list of known third-party ad hosts; not a custom filter list or bypass.
block_trackersblockTrackersBest-effort blocking of known third-party analytics and tracker hosts. Validate pages whose own scripts depend on a tag manager.
block_chatsblockChatsBest-effort request blocking and selector hiding for known third-party chat widgets, not an exhaustive widget filter.
block_cookie_bannershideCookieBannersHides common consent overlays after load. Latchshot does not click consent or set consent cookies.
block_banners_by_heuristicshidePopupsHides 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.

Query-string callers can migrate in two stages.

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.

Fit first. Implementation if it fits.

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.

  1. Inventory the exact options present in production requests; reject the migration if any required feature appears on the stop list.
  2. Create a representative set of public pages: ordinary, slow, animated, font-heavy, consent-banner, tall, and known-failure targets.
  3. Render the same fixed viewport and format through both providers. Compare image dimensions, visible content, fonts, navigation completion, and latency.
  4. Store Latchshot's X-Latchshot-Render-Ms, X-Latchshot-Navigation, X-Latchshot-Fonts, X-Latchshot-Scripts, and quota headers with job diagnostics.
  5. 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.

Use the Free plan as a migration sample, not production proof.

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.

Get a free key