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 →cdpfleet / Functions
Functions
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.
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 →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 →Feed a page to ChatGPT or Claude, save an article as notes, or index a site for search.
Open markdown →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 →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 →HTML, Markdown, text, links, a screenshot, XHR calls and cookies in one call — after clicks and typing, with CSS selectors returned as JSON.
Scrape →A site's URLs from its sitemaps and links in seconds; as a job, the whole site with no limit.
Map →The same page from up to five countries side by side, with a diff of what changes.
Geo compare →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 →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 →Stay on a page and stream its XHR, WebSocket and DOM changes live.
Watch →A browser that browses a site like a person on one IP, building up cookies — scrape in its tab whenever you need.
Warmup →Check a page on a schedule and get a diff by webhook or email when it changes.
Monitors →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.
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'
// 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 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 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");
}
}
// .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 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))
}