Java SDK

The official Java SDK for RenderScreenshot.

Installation

Maven

Add the JitPack repository:

<repositories>
    <repository>
        <id>jitpack.io</id>
        <url>https://jitpack.io</url>
    </repository>
</repositories>

Add the dependency:

<dependency>
    <groupId>com.github.Render-Screenshot</groupId>
    <artifactId>rs-java</artifactId>
    <version>v1.0.0</version>
</dependency>

Gradle

Add the JitPack repository:

repositories {
    maven { url 'https://jitpack.io' }
}

Add the dependency:

implementation 'com.github.Render-Screenshot:rs-java:v1.0.0'

Requirements

  • Java 11 or higher

Quick Start

import com.renderscreenshot.sdk.Client;
import com.renderscreenshot.sdk.TakeOptions;

import java.nio.file.Files;
import java.nio.file.Path;

Client client = new Client("rs_live_xxxxx");

// Take a screenshot
byte[] image = client.take(
    TakeOptions.url("https://example.com").preset("og_card")
);

Files.write(Path.of("screenshot.png"), image);

Client

Constructor

import com.renderscreenshot.sdk.Client;

Client client = new Client(apiKey);
Client client = new Client(apiKey, baseUrl, timeout);
Parameter Type Description
apiKey String Your API key (rs_live_* or rs_test_*)
baseUrl String API base URL (default: https://api.renderscreenshot.com)
timeout Duration Request timeout (default: 30 seconds)

Methods

take(options)

Take a screenshot and return binary data.

byte[] image = client.take(
    TakeOptions.url("https://example.com").preset("og_card")
);

// Save to file
Files.write(Path.of("screenshot.png"), image);

Returns: byte[]

takeJson(options)

Take a screenshot and return JSON metadata.

ScreenshotResponse response = client.takeJson(
    TakeOptions.url("https://example.com").preset("og_card")
);

System.out.println(response.getUrl());     // CDN URL
System.out.println(response.getWidth());   // 1200
System.out.println(response.getHeight());  // 630
System.out.println(response.isCached());   // true/false

Returns: ScreenshotResponse

generateUrl(options, expiresAt)

Generate a signed URL for public embedding.

import java.time.Duration;
import java.time.Instant;

String signedUrl = client.generateUrl(
    TakeOptions.url("https://example.com").preset("og_card"),
    Instant.now().plus(Duration.ofHours(24)) // 24 hours
);

// Use in HTML: <img src="${signedUrl}" />

Returns: String

batch(urls, options) / batchAdvanced(requests)

Process multiple screenshots in a batch.

import java.util.Arrays;
import java.util.List;

// Simple batch
List<String> urls = Arrays.asList(
    "https://example1.com",
    "https://example2.com"
);

BatchResponse results = client.batch(urls,
    TakeOptions.url("").preset("og_card")
);

// Advanced batch with per-URL options
List<Client.BatchRequest> requests = Arrays.asList(
    new Client.BatchRequest("https://example1.com",
        TakeOptions.url("https://example1.com").preset("og_card")),
    new Client.BatchRequest("https://example2.com",
        TakeOptions.url("https://example2.com").width(1920))
);

BatchResponse results = client.batchAdvanced(requests);

Returns: BatchResponse

getBatch(batchId)

Get the status of a batch job.

BatchResponse status = client.getBatch("batch_abc123");
System.out.println(status.getCompleted() + "/" + status.getTotal());

Returns: BatchResponse

presets() / preset(id)

Get available presets.

List<Preset> presets = client.presets();
Preset ogCard = client.preset("og_card");

devices()

Get available device presets.

List<Device> devices = client.devices();

TakeOptions

Fluent builder for screenshot options.

Creating Options

import com.renderscreenshot.sdk.TakeOptions;

// From URL
TakeOptions options = TakeOptions.url("https://example.com");

// From HTML
TakeOptions options = TakeOptions.html("<h1>Hello World</h1>");

Viewport Options

TakeOptions.url("...")
    .width(1200)           // Viewport width
    .height(630)           // Viewport height
    .scale(2.0)            // Device scale factor (1-3)
    .mobile();             // Enable mobile emulation

Capture Options

TakeOptions.url("...")
    .fullPage()            // Capture full scrollable page
    .element(".hero")      // Capture specific element
    .format("png")         // png, jpeg, webp, pdf
    .quality(90);          // JPEG/WebP quality (1-100)

Wait Options

TakeOptions.url("...")
    .waitFor("networkidle")      // load, networkidle, domcontentloaded
    .delay(2000)                 // Additional delay (ms)
    .waitForSelector(".loaded")  // Wait for selector
    .waitForTimeout(30000);      // Max wait time (ms)

Presets & Devices

TakeOptions.url("...")
    .preset("og_card")           // Use a preset
    .device("iphone_14_pro");    // Emulate a device

Content Blocking

TakeOptions.url("...")
    .blockAds()                  // Block ad networks
    .blockTrackers()             // Block analytics
    .blockCookieBanners()        // Auto-dismiss cookie popups
    .blockChatWidgets()          // Block chat widgets
    .blockUrls(Arrays.asList("*.ads.com/*"))   // Block URL patterns
    .blockResources(Arrays.asList("font"));    // Block resource types

Browser Emulation

TakeOptions.url("...")
    .darkMode()                  // Enable dark mode
    .reducedMotion()             // Prefer reduced motion
    .mediaType("print")          // screen or print
    .userAgent("Custom UA")      // Custom user agent
    .timezone("America/New_York")
    .locale("en-US")
    .geolocation(40.7128, -74.006);

Network Options

import java.util.Map;
import java.util.HashMap;

Map<String, String> headers = new HashMap<>();
headers.put("X-Custom", "value");

TakeOptions.url("...")
    .headers(headers)
    .authBasic("user", "pass")
    .authBearer("token")
    .bypassCsp();

Cache Options

TakeOptions.url("...")
    .cacheTtl(86400)             // Cache TTL in seconds
    .cacheRefresh();             // Force refresh

PDF Options

TakeOptions.url("...")
    .format("pdf")
    .pdfPaperSize("a4")          // a4, letter, legal, etc.
    .pdfLandscape()
    .pdfMargin("1in")
    .pdfPrintBackground()
    .pdfHeader("<div>Header</div>")
    .pdfFooter("<div>Page <span class=\"pageNumber\"></span></div>");

Storage Options (BYOS)

TakeOptions.url("...")
    .storageEnabled()
    .storagePath("{year}/{month}/{hash}.{ext}")
    .storageAcl("public-read");

Cache Management

// Get cached screenshot
byte[] image = client.cache.get("cache_xyz789");

// Delete single entry
client.cache.delete("cache_xyz789");

// Bulk purge by keys
CacheManager.PurgeResponse result = client.cache.purge(
    Arrays.asList("cache_abc", "cache_def")
);
System.out.println("Purged: " + result.getPurged());

// Purge by URL pattern
client.cache.purgeUrl("https://mysite.com/blog/*");

// Purge by storage path pattern
client.cache.purgePattern("screenshots/2024/*");

// Purge by date
client.cache.purgeBefore(Instant.parse("2024-01-01T00:00:00Z"));

Webhook Helpers

import com.renderscreenshot.sdk.Webhook;
import com.renderscreenshot.sdk.Webhook.WebhookEvent;

// Verify signature
boolean isValid = Webhook.verify(payload, signature, timestamp, secret);

// Parse event
WebhookEvent event = Webhook.parse(payload);
if ("screenshot.completed".equals(event.getType())) {
    System.out.println("Screenshot completed: " + event.getData());
}

// Extract headers (case-insensitive)
String[] headers = Webhook.extractHeaders(requestHeaders);
String signature = headers[0];
String timestamp = headers[1];

Error Handling

import com.renderscreenshot.sdk.RenderScreenshotException;

try {
    byte[] image = client.take(TakeOptions.url("..."));
} catch (RenderScreenshotException e) {
    System.out.println(e.getHttpStatus());  // 400, 429, etc.
    System.out.println(e.getCode());        // "invalid_url", "rate_limited"
    System.out.println(e.getMessage());     // Human-readable message
    System.out.println(e.isRetryable());    // true/false

    if (e.isRetryable() && e.getRetryAfter() != null) {
        Thread.sleep(e.getRetryAfter() * 1000L);
        // Retry the request...
    }
}

Error Codes

Code HTTP Retryable Description
invalid_request 400 No Malformed request
invalid_url 400 No Invalid URL provided
unauthorized 401 No Invalid API key
forbidden 403 No Access denied
not_found 404 No Resource not found
rate_limited 429 Yes Rate limit exceeded
timeout 408 Yes Screenshot timed out
render_failed 500 Yes Browser rendering failed
internal_error 500 Yes Internal server error

Was this page helpful?