[cdpfleet](https://cdpfleet.com/) / Functions

Functions

# Browser tasks, *one call* each.

Functions run a ready-made task in a real browser on the cdpfleet fleet — from the country you choose — and give you the result: no browser to launch, connect or close. Try the free tools below without signing up, or call any of them from code and the [dashboard](https://cdpfleet.com/app#functions).

[Try a free tool](https://cdpfleet.com/functions/screenshot)[Open in the dashboard](https://cdpfleet.com/app#functions)[API docs](https://cdpfleet.com/docs/functions)

-   **5**free tools
-   **12**Functions
-   **51**countries
-   **0**sign-ups to try

## Try them free

### Screenshot

Check how a page looks from another country, capture it for a ticket or a report, or test what a link preview will show.

[Open screenshot →](https://cdpfleet.com/functions/screenshot)

### PDF

Archive a page as it looked today, attach it to an email, or keep a receipt. The free tool's PDF is an image of the page; over the API, a run in Chrome gives a text PDF.

[Open pdf →](https://cdpfleet.com/functions/pdf)

### Markdown

Feed a page to ChatGPT or Claude, save an article as notes, or index a site for search.

[Open markdown →](https://cdpfleet.com/functions/markdown)

### Live tab

Check what a site shows in another country, test a page without exposing your own IP, or try cdpfleet's browsers by hand. With an API key the tab stays open longer, can be shared with someone by link, and hands its cookies back to your code.

[Open live tab →](https://cdpfleet.com/functions/livetab)

### Raw page

Find the API a page gets its data from, debug what a single-page app fetches, or check which cookies a site sets on first visit.

[Open raw page →](https://cdpfleet.com/functions/rawpage)

## Everything Functions do

### Scrape

HTML, Markdown, text, links, a screenshot, XHR calls and cookies in one call — after clicks and typing, with CSS selectors returned as JSON.

[Scrape →](https://cdpfleet.com/docs/functions/scrape)

### Map

A site's URLs from its sitemaps and links in seconds; as a job, the whole site with no limit.

[Map →](https://cdpfleet.com/docs/functions/map)

### Geo compare

The same page from up to five countries side by side, with a diff of what changes.

[Geo compare →](https://cdpfleet.com/docs/functions/geo)

### Live tab

A remote tab you or anyone with the link can use from a browser — sign in by hand, then hand the cookies to your code.

[Live tab →](https://cdpfleet.com/docs/functions/livetab)

### Batch and crawl

Any number of URLs, or a whole site, in the background for as long as it takes; results as JSON lines or a zip.

[Jobs →](https://cdpfleet.com/docs/jobs)

### Watch

Stay on a page and stream its XHR, WebSocket and DOM changes live.

[Watch →](https://cdpfleet.com/docs/jobs#watch)

### Warmup

A browser that browses a site like a person on one IP, building up cookies — scrape in its tab whenever you need.

[Warmup →](https://cdpfleet.com/docs/jobs#warmup)

### Monitors

Check a page on a schedule and get a diff by webhook or email when it changes.

[Monitors →](https://cdpfleet.com/docs/monitors)

## How the free tools work

-   **20 runs a day** and 2 at once per address, after a quick Cloudflare check.
-   Runs on a shared cdpfleet browser through the free [Community proxy](https://cdpfleet.com/community) in the country you pick; at busy times a run can take longer or ask you to retry.
-   Public pages only: private and local addresses are refused. Up to 60 seconds per page.
-   For more — your own threads, your own or residential proxies, any browser and phone devices — call the same functions with an API key; the [Community plan](https://cdpfleet.com/community) is free, and [paid plans](https://cdpfleet.com/upgrade) add more.

## The same from code

One HTTP call per page with your API key: no browser code, no Playwright. Billed like a browser session — a call holds one thread while it runs.

 

```bash
curl -s https://cdpfleet.com/v1/functions/screenshot \
  -H "x-api-key: $CDPFLEET_API_KEY" -H "content-type: application/json" \
  -d '{"url":"https://example.com/","country":"de","full_page":true}' -o shot.png -D - | grep -i '^x-call-id'
```

```js
// Node.js 18+: save as screenshot.mjs, run node screenshot.mjs
import { writeFile } from 'node:fs/promises';

const res = await fetch('https://cdpfleet.com/v1/functions/screenshot', {
  method: 'POST',
  headers: { 'x-api-key': process.env.CDPFLEET_API_KEY, 'content-type': 'application/json' },
  body: JSON.stringify({
    url: 'https://example.com/',
    country: 'de',
    full_page: true,
  }),
  signal: AbortSignal.timeout(30000),
});
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`); // 429: wait Retry-After seconds
const bytes = Buffer.from(await res.arrayBuffer());
await writeFile('shot.png', bytes);
console.log(`shot.png: ${bytes.length} bytes`);
```

```python
# Python 3 with requests (pip install requests): save as screenshot.py, run python screenshot.py
import os
import requests

r = requests.post(
    "https://cdpfleet.com/v1/functions/screenshot",
    headers={"x-api-key": os.environ["CDPFLEET_API_KEY"]},
    json={
        "url": "https://example.com/",
        "country": "de",
        "full_page": True,
    },
    timeout=30,
)
if not r.ok:
    raise SystemExit(f"{r.status_code} {r.text}")  # 429: wait r.headers["Retry-After"] seconds
open("shot.png", "wb").write(r.content)
print(f"shot.png: {len(r.content)} bytes")
```

```java
// Java 17+: save as Main.java, run java Main.java
import java.net.URI;
import java.net.http.*;
import java.nio.file.*;
import java.time.Duration;

public class Main {
  public static void main(String[] args) throws Exception {
    String body = """
        {
          "url": "https://example.com/",
          "country": "de",
          "full_page": true
        }
        """;
    HttpResponse<byte[]> res = HttpClient.newHttpClient().send(
        HttpRequest.newBuilder(URI.create("https://cdpfleet.com/v1/functions/screenshot"))
            .header("x-api-key", System.getenv("CDPFLEET_API_KEY"))
            .header("content-type", "application/json")
            .timeout(Duration.ofSeconds(30))
            .POST(HttpRequest.BodyPublishers.ofString(body))
            .build(),
        HttpResponse.BodyHandlers.ofByteArray());
    if (res.statusCode() != 200) { // 429: wait Retry-After seconds
      throw new RuntimeException(res.statusCode() + " " + new String(res.body()));
    }
    Files.write(Path.of("shot.png"), res.body());
    System.out.println("shot.png: " + res.body().length + " bytes");
  }
}
```

```csharp
// .NET 8+: dotnet new console, replace Program.cs with this, run dotnet run
using System.Text;

using var http = new HttpClient { Timeout = TimeSpan.FromSeconds(30) };
http.DefaultRequestHeaders.Add("x-api-key", Environment.GetEnvironmentVariable("CDPFLEET_API_KEY"));
var body = """
    {
      "url": "https://example.com/",
      "country": "de",
      "full_page": true
    }
    """;
var res = await http.PostAsync("https://cdpfleet.com/v1/functions/screenshot",
    new StringContent(body, Encoding.UTF8, "application/json"));
if (!res.IsSuccessStatusCode) // 429: wait Retry-After seconds
    throw new Exception($"{(int)res.StatusCode} {await res.Content.ReadAsStringAsync()}");
var bytes = await res.Content.ReadAsByteArrayAsync();
await File.WriteAllBytesAsync("shot.png", bytes);
Console.WriteLine($"shot.png: {bytes.Length} bytes");
```

```go
// Go 1.21+: save as main.go, run go run main.go
package main

import (
	"fmt"
	"io"
	"log"
	"net/http"
	"os"
	"strings"
	"time"
)

func main() {
	body := `{
	  "url": "https://example.com/",
	  "country": "de",
	  "full_page": true
	}`
	req, _ := http.NewRequest("POST", "https://cdpfleet.com/v1/functions/screenshot", strings.NewReader(body))
	req.Header.Set("x-api-key", os.Getenv("CDPFLEET_API_KEY"))
	req.Header.Set("content-type", "application/json")
	res, err := (&http.Client{Timeout: 30 * time.Second}).Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer res.Body.Close()
	data, err := io.ReadAll(res.Body)
	if err != nil {
		log.Fatal(err)
	}
	if res.StatusCode != http.StatusOK { // 429: wait Retry-After seconds
		log.Fatalf("%s %s", res.Status, data)
	}
	if err := os.WriteFile("shot.png", data, 0o644); err != nil {
		log.Fatal(err)
	}
	fmt.Printf("shot.png: %d bytes\n", len(data))
}
```

## Related

Cases, recipes, posts and comparisons about this — updated as new ones are published.

### Reference docs

The details, options and errors.

-   [Functions](https://cdpfleet.com/docs/functions)Fields, billing, errors and countries.
-   [Screenshot function](https://cdpfleet.com/docs/functions/screenshot)A PNG or JPEG of the page as a real browser renders it, the viewport or the full page.
-   [PDF function](https://cdpfleet.com/docs/functions/pdf)The full page as a single-page PDF, A4 or Letter wide.
-   [Markdown function](https://cdpfleet.com/docs/functions/markdown)The page's main content as clean Markdown, ready for an LLM or a search index.
-   [Live tab function](https://cdpfleet.com/docs/functions/livetab)One remote browser tab you — or anyone you send the link to — can see and control in a web browser: log in by hand, solve your own CAPTCHA, show a page from another country, then let your code carry on.
-   [Raw page function](https://cdpfleet.com/docs/functions/rawpage)Scrape's first name, kept working: the rendered HTML with the final URL and status, redirects, and optionally the page's XHR/fetch calls with their responses, cookies and console output.

### Cases 42

Real problems solved end to end, run on production in five languages.

-   [Case 89: Watch a page live: its XHR calls, DOM changes and WebSocket messages over SSE and a signed webhook](https://cdpfleet.com/docs/cases/watch-a-page-live)Keep a Chrome of yours on a page that updates itself (the ISS position, polled about once a second), and get every matching XHR response and every change to one…[Code on GitHub](https://github.com/cdpfleet/cdpfleet/tree/main/cases/89-watch-a-page-live)
-   [Case 88: A monitor end to end: create it, trigger a change, verify the signed webhook, read the diff and history](https://cdpfleet.com/docs/cases/monitor-end-to-end)Watch one element of a page that changes on every load, trigger checks with `POST …/run`, receive the `monitor.change` webhook and verify its HMAC signature, check…[Code on GitHub](https://github.com/cdpfleet/cdpfleet/tree/main/cases/88-monitor-end-to-end)
-   [Case 87: Geo compare: the same pages from five countries in one call, and reading the diff](https://cdpfleet.com/docs/cases/geo-compare)One `POST /v1/functions/geo` per page loads it from the US, Germany, the UK, Japan and Brazil at once and returns each country's Markdown and HTML plus a diff…[Code on GitHub](https://github.com/cdpfleet/cdpfleet/tree/main/cases/87-geo-compare)
-   [Case 86: Crawl a whole site as a job: map, crawl, stop, resume, results, zip and a signed webhook](https://cdpfleet.com/docs/cases/crawl-a-site-as-a-job)Map books.toscrape.com, crawl 100 pages of it as a background job, stop it part-way and resume it, then read the results as JSON lines and as a zip archive, and…[Code on GitHub](https://github.com/cdpfleet/cdpfleet/tree/main/cases/86-crawl-a-site-as-a-job)
-   [Case 84: Does the TLS fingerprint (JA4) explain which browsers got in? Twelve browsers against six vendors](https://cdpfleet.com/docs/cases/ja4-vs-vendor-verdicts)Each of the twelve browsers from the real-site lab week loads a TLS echo page once, so we know the JA4, peetprint and HTTP/2 fingerprint it sends. Grouped by…[Code on GitHub](https://github.com/cdpfleet/cdpfleet/tree/main/cases/84-ja4-vs-vendor-verdicts)
-   [Case 85: A Function or your own browser? Screenshot, PDF and Markdown of the same pages, timed and billed](https://cdpfleet.com/docs/cases/function-vs-your-own-browser)Three pages, three outputs, two ways: one POST to a Function, or launch a browser yourself, connect Playwright, capture and close. Wall time, the thread-seconds each…[Code on GitHub](https://github.com/cdpfleet/cdpfleet/tree/main/cases/85-function-vs-your-own-browser)
-   [Case 83: Brave's fingerprint randomisation per site, per context and per launch, and what public fingerprint pages make of it](https://cdpfleet.com/docs/cases/brave-farbling)Brave adds noise to canvas, audio, cores, memory and the plugin list, keyed to the site and the session. One probe on two made-up sites, the same site again, a…[Code on GitHub](https://github.com/cdpfleet/cdpfleet/tree/main/cases/83-brave-farbling)
-   [Case 81: Behaviour scoring: Camoufox humanize on and off vs plain Chrome clicks on a public bot-test form](https://cdpfleet.com/docs/cases/behaviour-scoring-humanize)A public behavioural bot-test page scores how a demo login form was filled in: clicks, keystrokes, timing. Camoufox with `humanize` off, on and slowed down, and…[Code on GitHub](https://github.com/cdpfleet/cdpfleet/tree/main/cases/81-behaviour-scoring-humanize)

[All cases →](https://cdpfleet.com/docs/cases) 42 match this topic

### Updates 14

Product news and browser releases.

-   [The live tab: a remote browser tab you share as a link](https://cdpfleet.com/docs/updates/live-tab)Open a real browser tab in another country and use it from any web browser — free on the site, longer from the dashboard or one API call, and a link you can hand to…
-   [Opera 140: Chromium 157 underneath, HTTPS-First turned on (and off on cdpfleet)](https://cdpfleet.com/docs/updates/opera-140)Stable Opera on the fleet is now 140.0.6074.17, on Chromium 157: HTTPS-First mode (kept off on cdpfleet), Protected Audience gone, TLS unchanged.
-   [Brave 1.99: Chromium 157 underneath, Protected Audience gone, same TLS fingerprint](https://cdpfleet.com/docs/updates/brave-1-99)Stable Brave on the fleet is now 1.99.55, on Chromium 157: four new web features, Protected Audience gone, plain HTTP loads, TLS and HTTP/2 unchanged.
-   [Edge 157: Chromium 157, HTTPS-First kept off on cdpfleet, Protected Audience gone](https://cdpfleet.com/docs/updates/edge-157)Stable Edge on the fleet is now 157.0.4341.42, on Chromium 157: HTML streaming, Protected Audience gone, HTTPS-First kept off on cdpfleet, TLS unchanged.
-   [Whale 5.41: Chromium 150 to 156 in one step, and now Chrome's TLS fingerprint](https://cdpfleet.com/docs/updates/whale-5-41)Stable Whale on the fleet is now 5.41.429.3, on Chromium 156: six Chromium majors at once, Chrome's JA4, plain HTTP still loads, Shared Storage gone.
-   [Chrome 157: HTTPS-First turned on (and off on cdpfleet), Protected Audience gone, same TLS fingerprint](https://cdpfleet.com/docs/updates/chrome-157)Stable Chrome on the fleet is now 157.0.8103.38: HTTPS-First mode (kept off on cdpfleet), Protected Audience gone, TLS and HTTP/2 unchanged.
-   [Kept downloads: files from a session, fetched after it ends](https://cdpfleet.com/docs/updates/kept-downloads)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…
-   [50 tabs per session, memory as the ceiling, and the memory option](https://cdpfleet.com/docs/updates/tabs-and-memory)Every plan now allows 50 tabs in one session; what actually limits a session is its memory — 2, 4 or 6 GB by plan — and the new "memory" launch option buys 2–4 times…

[All updates →](https://cdpfleet.com/docs/updates) 14 match this topic

### Browser comparisons 6

Measured side by side on the fleet.

-   [Yandex Browser vs Chrome](https://cdpfleet.com/docs/compare/yandex-vs-chrome)Yandex Browser 26.8 runs on Chromium 150, six majors behind Chrome 156, names itself in the user agent and client hints, puts Russian first in navigator.languages…
-   [Camoufox vs Firefox, headless](https://cdpfleet.com/docs/compare/camoufox-vs-firefox-headless)Headless Firefox and headless Camoufox (both based on Firefox source; not affiliated with Mozilla) side by side: the headless tells a page can read, what Camoufox…
-   [Patchright vs Rebrowser](https://cdpfleet.com/docs/compare/patchright-vs-rebrowser)Two stealth-patched Chromium builds that look the same to a site — same TLS and HTTP/2 fingerprints, no webdriver, no Runtime.enable leak — but Patchright is…
-   [Chrome vs Chromium](https://cdpfleet.com/docs/compare/chrome-vs-chromium)Google's Chrome against the Chromium build Playwright ships: seven majors apart, one brand missing from the client hints, one TLS extension fewer — and, contrary to…
-   [Firefox vs Camoufox](https://cdpfleet.com/docs/compare/firefox-vs-camoufox)Playwright's Firefox build against the anti-detect fork built on it (both based on Firefox source; not affiliated with Mozilla): what Camoufox changes in what a site…
-   [Camoufox vs Patchright](https://cdpfleet.com/docs/compare/camoufox-vs-patchright)Two stealth browsers, two philosophies: a browser based on Firefox source (not affiliated with Mozilla) that spoofs the whole device at the C++ level, or a Chromium…

## Read next

[Screenshot →](https://cdpfleet.com/functions/screenshot)[PDF →](https://cdpfleet.com/functions/pdf)[Markdown →](https://cdpfleet.com/functions/markdown)[Live tab →](https://cdpfleet.com/functions/livetab)[Raw page →](https://cdpfleet.com/functions/rawpage)[Community plan →](https://cdpfleet.com/community)[Community vs paid →](https://cdpfleet.com/upgrade)

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