pxshot

Official Rust SDK for the Pxshot screenshot API.
Features
- Async-first: Built on
tokio and reqwest for high-performance async I/O
- Strongly typed: Full type safety with serde serialization
- Builder pattern: Ergonomic request construction
- Optional blocking client: Enable with the
blocking feature
Installation
Add this to your Cargo.toml:
[dependencies]
pxshot = "0.1"
tokio = { version = "1", features = ["rt-multi-thread", "macros"] }
Quick Start
use pxshot::{Pxshot, ScreenshotRequest, ImageFormat};
#[tokio::main]
async fn main() -> pxshot::Result<()> {
let client = Pxshot::new("px_your_api_key");
let response = client
.screenshot(
ScreenshotRequest::builder()
.url("https://example.com")
.format(ImageFormat::Png)
.width(1920)
.height(1080)
.build()?,
)
.await?;
let bytes = response.into_bytes().unwrap();
std::fs::write("screenshot.png", bytes)?;
Ok(())
}
Storing Screenshots
Instead of receiving raw bytes, you can store screenshots and get a URL:
use pxshot::{Pxshot, ScreenshotRequest};
#[tokio::main]
async fn main() -> pxshot::Result<()> {
let client = Pxshot::new("px_your_api_key");
let response = client
.screenshot(
ScreenshotRequest::builder()
.url("https://example.com")
.store(true)
.build()?,
)
.await?;
let stored = response.into_stored().unwrap();
println!("Screenshot URL: {}", stored.url);
println!("Expires at: {}", stored.expires_at);
println!("Dimensions: {}x{}", stored.width, stored.height);
Ok(())
}
Full Page Screenshots
Capture the entire scrollable page:
use pxshot::{Pxshot, ScreenshotRequest};
#[tokio::main]
async fn main() -> pxshot::Result<()> {
let client = Pxshot::new("px_your_api_key");
let response = client
.screenshot(
ScreenshotRequest::builder()
.url("https://example.com")
.full_page(true)
.build()?,
)
.await?;
Ok(())
}
Wait for Content
Wait for specific elements or additional load time:
use pxshot::{Pxshot, ScreenshotRequest, WaitUntil};
#[tokio::main]
async fn main() -> pxshot::Result<()> {
let client = Pxshot::new("px_your_api_key");
let response = client
.screenshot(
ScreenshotRequest::builder()
.url("https://example.com")
.wait_until(WaitUntil::NetworkIdle)
.wait_for_selector("#main-content")
.wait_for_timeout(1000) .build()?,
)
.await?;
Ok(())
}
Usage Statistics
Check your API usage:
use pxshot::Pxshot;
#[tokio::main]
async fn main() -> pxshot::Result<()> {
let client = Pxshot::new("px_your_api_key");
let usage = client.usage().await?;
println!("Screenshots this period: {}", usage.screenshots);
println!("Bytes used: {}", usage.bytes);
println!("Period: {} to {}", usage.period_start, usage.period_end);
Ok(())
}
Blocking Client
For non-async contexts, enable the blocking feature:
[dependencies]
pxshot = { version = "0.1", features = ["blocking"] }
use pxshot::blocking::Pxshot;
use pxshot::ScreenshotRequest;
fn main() -> pxshot::Result<()> {
let client = Pxshot::new("px_your_api_key");
let response = client.screenshot(
ScreenshotRequest::builder()
.url("https://example.com")
.build()?,
)?;
if let Some(bytes) = response.bytes() {
std::fs::write("screenshot.png", bytes)?;
}
Ok(())
}
API Reference
ScreenshotRequest Options
| Option |
Type |
Description |
url |
String |
Required. URL to capture |
format |
ImageFormat |
Png, Jpeg, or Webp (default: Png) |
quality |
u8 |
Image quality 1-100 (JPEG/WebP only) |
width |
u32 |
Viewport width in pixels |
height |
u32 |
Viewport height in pixels |
full_page |
bool |
Capture full scrollable page |
wait_until |
WaitUntil |
Load, DomContentLoaded, or NetworkIdle |
wait_for_selector |
String |
Wait for CSS selector |
wait_for_timeout |
u32 |
Additional wait time in ms |
device_scale_factor |
f32 |
Device pixel ratio (1-3) |
store |
bool |
Return URL instead of bytes |
block_ads |
bool |
Block ads and trackers |
Error Handling
The SDK uses a custom Error type with detailed error variants:
use pxshot::{Pxshot, ScreenshotRequest, Error};
#[tokio::main]
async fn main() {
let client = Pxshot::new("px_your_api_key");
let result = client
.screenshot(
ScreenshotRequest::builder()
.url("https://example.com")
.build()
.unwrap(),
)
.await;
match result {
Ok(response) => println!("Success!"),
Err(Error::Api { status, message }) => {
eprintln!("API error {}: {}", status, message);
}
Err(Error::Request(e)) => {
eprintln!("Network error: {}", e);
}
Err(e) => eprintln!("Other error: {}", e),
}
}
License
MIT License - see LICENSE for details.