![screeenly](https://3.screeenly.com/img/screeenly-3-logo.svg?v=2) 

  [← All posts](https://3.screeenly.com/blog) Changelog

Identical requests are now free
===============================

 SZ Stefan Zweifel · Nov 6, 2026 · 2 min read 

Until now, every request to screeenly started a browser, even if you had asked for the same screenshot a minute earlier. Each of those requests counted toward your monthly usage.

Starting today, screeenly remembers the result. When you send a request that matches an earlier successful request of your account, you get the stored file back. It's faster, and it doesn't count toward your usage or use a credit.

What counts as the same request
-------------------------------

Two requests match when they go to the same endpoint with the same URL (or the same HTML) and the same options. Options you leave out and options set to their default value are treated the same. Cookies, HTTP headers and basic auth credentials are part of the match, so a request with a different session cookie renders again.

The scheme and the host of the URL are compared without case, and the `#fragment` is ignored. The path and the query string have to match exactly.

Results are only reused within your own account. Another account never gets your files.

Files are kept for 24 hours
---------------------------

Screenshots, PDFs and rendered HTML used to expire after 60 minutes. They are now kept for 24 hours, and a matching request returns the stored result during that time. The `expires_at` field in the response tells you when the file goes away.

Playground results still expire after 60 minutes and are never reused.

How to tell a cached result from a new one
------------------------------------------

New renderFrom the cacheStatus code`201` `200` `X-Cache` header`MISS` `HIT`Counts toward usageYesNo

If your code checks for `201` exactly, change it to accept any `2xx` status.

Render again, or keep files for less time
-----------------------------------------

On a paid plan or with credits, you control the cache per request:

- `cache=false` skips the lookup and always renders a new file. Use it if you capture the same page to see whether it changed.
- `cache_ttl` sets how long the result is kept and reused, from 60 to 86,400 seconds. Use a short value if you don't want the file stored for a full day.

```bash
curl --request POST \
  --url https://3.screeenly.com/api/v1/shots \
  --header "Authorization: Bearer $TOKEN" \
  --data url=https://example.com \
  --data cache=false

```

Accounts on the free plan always use the cache with the 24 hour default.

Retry a request without paying twice
------------------------------------

There's a second way to avoid paying for the same work twice. Send an `X-Request-ID` header with a value of your choice. If the connection drops and you send the same request with the same ID again, screeenly returns the first response and adds `X-Request-Replayed: true`. The retry isn't charged.

- If you use the ID for a different request, you get a `422`.
- If the first request is still running, you get a `409`. Wait for it and retry.
- Failed requests aren't stored, so you can retry them with the same ID.

If you don't send the header, screeenly creates an ID for you and returns it in the `X-Request-ID` response header. Include it when you email support about a request.

Questions? Email support@screeenly.com.

 SZ

[Stefan Zweifel](https://stefanzweifel.dev) is a fullstack developer based in Zurich, Switzerland and the creator of screeenly.

   More posts [ Nov 6, 2026 · Journal Let your agent take screenshots ](https://3.screeenly.com/blog/mcp-server) [ Nov 6, 2026 · Changelog screeenly now has a free plan ](https://3.screeenly.com/blog/free-plan) [ screeenly Screenshots, PDFs and rendered HTML from one API. Start for free → ](https://3.screeenly.com)
