Screenshot API with 200 free monthly, no card
4.8(6)15Technology
Snap turns any public URL into PNG, JPEG, WebP, or PDF via one GET. Built for cron, scripts, and n8n. Free Developer: 200 screenshots/month, no credit card. Starter $9 for 5,000; Growth $29 for 30,000. Cookie-banner blocking on by default. Render cache hits within 1 hour are free, with X-Snap-Cache. Failed captures do not use a credit. Authenticate with api_key query, X-API-Key, or Bearer. No official SDKs, webhooks, S3, or geo proxies yet.
• One GET endpoint for PNG, JPEG, WebP, or PDF
• 200 free screenshots/month with no credit card
• Cookie-banner blocking on by default
• Render cache hits within 1 hour are free
• Failed captures do not use credits
• API-key query, X-API-Key, or Bearer authentication
• Cron jobs and scheduled screenshots
• Website previews and monitoring
• Reports, archives, and visual checks
• n8n workflows and automation
• Scripts and HTTP integrations
6 ratings
I am a SaaS programmer
AI video with native sound, paid per clip. Nothing stored.
A calmer Mac menu bar, one click away.
Enterprise Software. Intelligent Automation. Global Impact.
Comments
15The two details that would decide this for me sit near the bottom: failed captures not burning a credit, and cache hits inside an hour being free. Those are what make a nightly cron predictable to budget. Worth moving up next to the pricing table. One question: what does it return for a URL that redirects to a login wall?
I am a SaaS programmer
If a URL redirects to a login wall, Snap follows the redirect and captures the final rendered page (usually the login UI). That comes back as a normal screenshot and uses a credit. We don’t classify “login wall” as a special failed capture, and we don’t try to bypass auth/paywalls. If the render itself fails, no credit is used. Failed-capture policy + free cache hits are intentional for cron/n8n predictability — happy to move that copy higher on the page.
I think having a cap on failed scans would also be helpful
I am a SaaS programmer
Fair point. Today failed captures already do not burn a credit, but we do not yet rate-limit or hard-cap how many failed attempts a key can make in a window. A soft failed-scan cap (or clearer abuse guardrails) is a good safety valve for cron loops that keep retrying a bad URL — I'll put it on the list. If you try Snap and hit a failure pattern that would have burned money elsewhere, tell me what you saw: https://snap.flyhold.in/docs.html
I will try it it can be helpful. I have made a puzzle game which is wordable give it a try https://wordable.live/
For automated website previews, a bot-check page can return HTTP 200 and still produce an unusable screenshot. Does Snap detect challenge pages and count those as failed captures too? A distinct error code would make it easier to send those cases to manual review in n8n.
I am a SaaS programmer
Good question. Snap is not meant to bypass CAPTCHA or bot challenges (we say so in the docs). If Chromium lands on a challenge page that still returns HTTP 200, you get a screenshot of that challenge UI and it counts as a successful capture (uses a credit). We don’t currently emit a distinct error code for “looks like a bot check.” True failed captures (couldn’t complete the render) do not burn a credit. For n8n today: treat surprise challenge images as a workflow concern (e.g. visual/OCR check → manual review). Distinct challenge detection + a clear error code is a fair ask — on the list. Docs: https://snap.flyhold.in/docs.html · n8n recipe: https://snap.flyhold.in/guides-n8n.html
The failed-capture credit policy and free cache hits make this unusually predictable for scheduled jobs. For SPA screenshots, do you expose wait-until or selector options for fonts and lazy-loaded content? A small example for full-page capture would be useful for visual regression workflows.
I am a SaaS programmer
We do expose these already: - wait_until: load (default), domcontentloaded, networkidle0, networkidle2 - wait_for_selector: CSS selector before capture - delay: extra ms after navigation - full_page=true + optional scroll_to_load=true for lazy content Example: curl -G "https://snap.flyhold.in/v1/take" \ --data-urlencode "api_key=YOUR_API_KEY" \ --data-urlencode "url=https://example.com" \ --data-urlencode "full_page=true" \ --data-urlencode "scroll_to_load=true" \ --data-urlencode "wait_until=networkidle2" \ --data-urlencode "file_type=png" \ -o full-page.png CamelCase aliases (waitUntil, waitForSelector) work too. Full param list: https://snap.flyhold.in/docs.html
Indie hacker
The pricing shape is honest — 200/month with no card, and not billing cache hits, is exactly what cron jobs and n8n workflows need instead of a free tier that dies quietly. Two suggestions: since you call out n8n, shipping an importable community node (or a copy-paste HTTP node recipe in the docs) would remove most of the setup friction for that audience. Second, documenting the cache-miss case explicitly would help people tune TTLs when a workflow runs on a tight schedule.
I am a SaaS programmer
Agree on both. There’s already a copy-paste HTTP Request recipe (no community node yet): https://snap.flyhold.in/guides-n8n.html — an importable n8n community node is on the wishlist. Cache behavior today: default ≤1 hour render cache; HIT does not burn a credit; response header X-Snap-Cache: HIT|MISS|BYPASS; cache=false forces a miss (billed as a normal capture). I’ll make the MISS case more explicit next to pricing — thanks for the nudge. Site: https://snap.flyhold.in · pricing: https://snap.flyhold.in/#pricing
Prefect! will use it for generating OG images
I am a SaaS programmer
Nice — OG images are a solid fit for Snap. Typical pattern: render a public template URL (or a page you control) via GET /v1/take with file_type=png or webp, then use that image URL in your meta tags / social share step. Cookie banners are blocked by default so the image stays clean. 200 free/mo to try: https://snap.flyhold.in · docs: https://snap.flyhold.in/docs.html — if a specific template URL looks wrong, tell me and I’ll help debug.
For monitoring and visual-regression use cases - diffing a page's screenshot over time to catch unexpected changes - is the rendering engine version pinned per account, or could two calls a month apart differ just from a browser or font update on your end? That determinism matters more than raw speed for that use case, same spirit as the failed-capture policy - predictability is the actual feature for anything running on a schedule.
I am a SaaS programmer
For monitoring and visual regression, Chromium isn’t pinned to a fixed build per account today — updates can shift fonts/layout slightly between captures weeks apart. If you need hard determinism, keep a golden baseline and treat diffs with a tolerance, or only force cache=false when you intentionally want a fresh render. Pinning engine versions per key is a fair ask for that use case — on the list. Docs: https://snap.flyhold.in/docs.html