[Updates](https://cdpfleet.com/docs/updates) / product

# Kept downloads: files from a session, fetched after it ends

Launch with "downloads": true and every file the browser downloads is kept for 2 days — including files a person clicked in live view or an AI agent fetched through MCP — listed with size and sha256 and fetched through a private link.

2026-11-04

Until now a file existed only if your code caught it: `download.saveAs()` while the session was still connected. That misses the downloads nobody's code was waiting for — a person clicking "Export" in live view, an AI assistant working through the MCP server, a client that disconnected before the file finished. Since 2026-11-01 a session launched with `"downloads": true` keeps every file it downloads, and you fetch them after the session.

## How it works

-   Add `"downloads": true` to the launch request — on any browser. Your code still receives downloads as usual; the option only adds a copy kept on our side.
-   After the session, `GET /v1/me/downloads?session_id=…` lists each file with `name`, `bytes`, `sha256`, `source_url` and `expires_at`; `GET /v1/me/downloads/{id}/url` returns a private link valid for 15 minutes. The dashboard's Sessions page lists the same files.
-   AI assistants get them through the MCP server's `downloads` tool: names, sizes and a link each, after `close_browser`.
-   Measured on 2026-11-04: two files (200 KB and 30 bytes) started with a click and never saved by the client were listed 1.1 s after `browser.close()`, and the fetched bytes matched the listed sha256 and the original file.

## Limits

-   **Paid plans only** — a Community launch with the option gets `403 downloads_not_available`.
-   **Per session:** up to 1 GB and 200 files; later files aren't kept (your code still receives them).
-   **Per account:** 1 GB; when a new session's files would pass it, the oldest files are deleted.
-   **Kept for 2 days**, then deleted; `DELETE /v1/me/downloads/{id}` removes one sooner.
-   Every file is served as an attachment (`application/octet-stream`), never opened on cdpfleet.com — check the `sha256` if you pass files on.

## What isn't kept

-   Downloads in browser contexts a raw-CDP client creates itself (Puppeteer's `createBrowserContext()` over `cdpUrl`); the default context and Playwright contexts are covered.
-   Contexts opened with `acceptDownloads: false` — the browser doesn't download at all.
-   On WebKit, a `text/plain` response with `Content-Disposition: attachment` isn't treated as a download.

## Get started

-   The docs: [Downloads](https://cdpfleet.com/docs/downloads) and the option [downloads](https://cdpfleet.com/docs/options/downloads).
-   A complete program in five languages: [Keep the files a session downloads](https://cdpfleet.com/docs/examples#downloads).
-   Files while the session runs, byte for byte: [case 12](https://cdpfleet.com/docs/cases/files-up-and-down).
-   A person in live view and an AI agent over MCP, measured: [Downloads in practice](https://cdpfleet.com/docs/cases/downloads-in-practice).

---
Source: https://cdpfleet.com/docs/updates/kept-downloads · Markdown: https://cdpfleet.com/docs/updates/kept-downloads.md · All docs for AI tools: https://cdpfleet.com/llms.txt
