Allscreenshots Docs
SDKs

Rust SDK

Async-first Rust SDK with tokio runtime

Rust SDK

The official Rust SDK for the AllScreenshots API with async-first design using the tokio runtime.

Source code: GitHub | Crate: allscreenshots-sdk

Installation

Add to your Cargo.toml:

[dependencies]
allscreenshots-sdk = "0.1"
tokio = { version = "1", features = ["full"] }

Quick start

use allscreenshots_sdk::{AllscreenshotsClient, ScreenshotRequest};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = AllscreenshotsClient::from_env()?;

    let request = ScreenshotRequest::builder()
        .url("https://github.com")
        .device("Desktop HD")
        .build()?;

    let image_bytes = client.screenshot(&request).await?;
    std::fs::write("screenshot.png", &image_bytes)?;

    println!("Screenshot saved to screenshot.png");
    Ok(())
}

Configuration

From environment

// Reads API key from ALLSCREENSHOTS_API_KEY environment variable
let client = AllscreenshotsClient::from_env()?;

Builder pattern

use std::time::Duration;

let client = AllscreenshotsClient::builder()
    .api_key("your-api-key")
    .base_url("https://api.allscreenshots.com")
    .timeout(Duration::from_secs(60))
    .max_retries(3)
    .build()?;

Capture screenshots

Basic capture

let request = ScreenshotRequest::builder()
    .url("https://example.com")
    .build()?;

let image_bytes = client.screenshot(&request).await?;
std::fs::write("screenshot.png", &image_bytes)?;

With options

let request = ScreenshotRequest::builder()
    .url("https://example.com")
    .device("Desktop HD")
    .format("png")
    .full_page(true)
    .dark_mode(true)
    .block_ads(true)
    .block_cookie_banners(true)
    .delay(1000)
    .build()?;

let image_bytes = client.screenshot(&request).await?;

Device presets

// Desktop
let desktop = client.screenshot(
    &ScreenshotRequest::builder()
        .url("https://example.com")
        .device("Desktop HD")
        .build()?
).await?;

// Mobile
let mobile = client.screenshot(
    &ScreenshotRequest::builder()
        .url("https://example.com")
        .device("iPhone 15")
        .build()?
).await?;

// Tablet
let tablet = client.screenshot(
    &ScreenshotRequest::builder()
        .url("https://example.com")
        .device("iPad Pro 11")
        .build()?
).await?;

Async jobs

For long-running captures:

// Create async job
let job = client.screenshot_async(
    &ScreenshotRequest::builder()
        .url("https://example.com")
        .full_page(true)
        .build()?
).await?;

println!("Job ID: {}", job.job_id);

// Poll for completion
let status = client.get_job(&job.job_id).await?;

if status.status == "completed" {
    let image_bytes = client.get_job_result(&job.job_id).await?;
    std::fs::write("screenshot.png", &image_bytes)?;
}

Bulk capture

Process multiple URLs efficiently:

use allscreenshots_sdk::{BulkRequest, BulkUrl, BulkDefaults};

let bulk_job = client.bulk(&BulkRequest {
    urls: vec![
        BulkUrl { url: "https://example1.com".to_string(), ..Default::default() },
        BulkUrl { url: "https://example2.com".to_string(), ..Default::default() },
        BulkUrl { url: "https://example3.com".to_string(), ..Default::default() },
    ],
    defaults: Some(BulkDefaults {
        device: Some("Desktop HD".to_string()),
        format: Some("png".to_string()),
        ..Default::default()
    }),
}).await?;

// Check status
let status = client.get_bulk_job(&bulk_job.bulk_job_id).await?;

Composition

Combine multiple screenshots into a single image:

use allscreenshots_sdk::{ComposeRequest, Variant, OutputOptions};

let composed = client.compose(&ComposeRequest {
    url: "https://example.com".to_string(),
    variants: vec![
        Variant { device: "Desktop HD".to_string(), label: Some("Desktop".to_string()) },
        Variant { device: "iPhone 15".to_string(), label: Some("Mobile".to_string()) },
    ],
    output: Some(OutputOptions {
        layout: Some("horizontal".to_string()),
        spacing: Some(20),
        ..Default::default()
    }),
}).await?;

Schedules

Create recurring screenshot captures:

use allscreenshots_sdk::CreateScheduleRequest;

// Create a schedule
let schedule = client.schedules().create(&CreateScheduleRequest {
    name: "Daily Homepage".to_string(),
    url: "https://example.com".to_string(),
    schedule: "0 9 * * *".to_string(),
    timezone: Some("America/New_York".to_string()),
    ..Default::default()
}).await?;

// List schedules
let schedules = client.schedules().list().await?;

// Get captures
let captures = client.schedules().get_captures(&schedule.schedule_id).await?;

Usage tracking

Monitor your API usage:

let usage = client.usage().get().await?;
println!("Screenshots: {}/{}", usage.screenshot_count, usage.quota);

Error handling

The SDK provides typed errors for different scenarios:

use allscreenshots_sdk::Error;

match client.screenshot(&request).await {
    Ok(image_bytes) => {
        std::fs::write("screenshot.png", &image_bytes)?;
    }
    Err(Error::RateLimit { retry_after }) => {
        println!("Rate limited. Retry after {}s", retry_after);
    }
    Err(Error::Authentication(_)) => {
        println!("Invalid API key");
    }
    Err(Error::Validation(msg)) => {
        println!("Validation error: {}", msg);
    }
    Err(Error::Timeout) => {
        println!("Request timed out");
    }
    Err(e) => {
        println!("Error: {}", e);
    }
}

Concurrent requests

use futures::future::join_all;

let urls = vec![
    "https://example1.com",
    "https://example2.com",
    "https://example3.com",
];

let futures: Vec<_> = urls.iter().map(|url| {
    let client = client.clone();
    async move {
        let request = ScreenshotRequest::builder()
            .url(*url)
            .build()
            .unwrap();
        client.screenshot(&request).await
    }
}).collect();

let results = join_all(futures).await;

License

Apache License 2.0

On this page