Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

To use ScreenshotOne in a Laravel application, install its official PHP SDK with Composer, keep your API access key in environment-backed configuration, and call the SDK from an application service or job. The SDK can build a request URL or fetch the rendered image bytes directly. The Laravel configuration and dependency-injection examples below are application patterns; ScreenshotOne documents the PHP SDK, but not a Laravel-specific package or service-provider recipe.

Install the ScreenshotOne PHP SDK

From your Laravel project directory, install the SDK:

composer require screenshotone/sdk:^1.0

Package metadata for version 1.0.10, published July 30, 2026, declares PHP 7.4 or later and a Guzzle dependency of ^7.15.2 || ^8.0.1. Check the current package metadata before installing if your project uses an older PHP version or has dependency constraints. See the package metadata on Packagist and ScreenshotOne’s PHP SDK guide.

Store API keys in Laravel configuration

ScreenshotOne uses an access key to authenticate API requests. Its separate secret key is for signing public links or verifying signed webhook payloads; it should not be sent as a request parameter. Keep both values out of source control, and use HTTPS for API calls. ScreenshotOne explicitly advises: “Always call the ScreenshotOne API over HTTPS.” See its API keys guide and Getting Started guide.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Add the credentials to your local .env file:

SCREENSHOTONE_ACCESS_KEY=your_access_key_here
SCREENSHOTONE_SECRET_KEY=your_secret_key_here

Do not commit .env. Add environment-backed entries to config/services.php so the application can read the credentials through Laravel’s configuration system:

'screenshotone' => [
    'access_key' => env('SCREENSHOTONE_ACCESS_KEY'),
    'secret_key' => env('SCREENSHOTONE_SECRET_KEY'),
],

After changing environment-backed configuration in a deployed application, rebuild Laravel’s configuration cache as part of your deployment process. Avoid returning a generated request URL to a public client if it contains the access key.

Wrap the SDK in a Laravel service

A small service provides a testable seam and keeps capture code out of controllers. This is ordinary Laravel application wiring, not a ScreenshotOne-prescribed integration. The SDK example uses ScreenshotOneSdkClient and ScreenshotOneSdkTakeOptions, sets a target URL and options, then calls take() for image bytes.

<?php

namespace AppServices;

use ScreenshotOneSdkClient;
use ScreenshotOneSdkTakeOptions;

class ScreenshotService
{
    private Client $client;

    public function __construct()
    {
        $this->client = new Client(
            config('services.screenshotone.access_key'),
            config('services.screenshotone.secret_key')
        );
    }

    public function capture(string $url): string
    {
        $options = TakeOptions::url($url)
            ->fullPage(true)
            ->delay(2);

        return $this->client->take($options);
    }
}

The full-page and two-second delay settings follow the vendor’s PHP example. The SDK also supports generating a request URL from options if your workflow needs a URL rather than the returned bytes. Review the PHP SDK guide for the SDK’s current method details.

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Save a capture through Laravel’s storage system

The service returns binary image data; Laravel can persist those bytes with its filesystem abstraction. This controller pattern validates the submitted target as a URL, calls the service, and stores the result on the configured disk:

<?php

namespace AppHttpControllers;

use AppServicesScreenshotService;
use IlluminateHttpRequest;
use IlluminateSupportFacadesStorage;

class ScreenshotController
{
    public function store(Request $request, ScreenshotService $screenshots)
    {
        $validated = $request->validate([
            'url' => ['required', 'url'],
        ]);

        $bytes = $screenshots->capture($validated['url']);
        $path = 'screenshots/' . uniqid('capture-', true) . '.png';

        Storage::disk('local')->put($path, $bytes);

        return response()->json(['path' => $path]);
    }
}

The example assumes the default image output is PNG and stores it on Laravel’s local disk. If you select a different output format, use the matching file extension and content type. Validate and authorize target URLs according to your application’s threat model: accepting arbitrary URLs can let a user make your server request internal or otherwise sensitive network resources. Do not expose a local storage path as if it were a public download URL.

Choose output and persistence deliberately

Image, PDF, or rendered text

ScreenshotOne documents PNG, JPEG/JPG, WebP, GIF, JP2, TIFF, AVIF, HEIF, PDF, HTML, and Markdown output options. Choose the format based on what consumes the result: an image for a visual preview, PDF for a document workflow, or HTML/Markdown when the downstream task needs rendered content rather than pixels. Confirm current availability and plan terms for the format you need; the option documentation lists formats but does not establish that every format is included on every plan. See Screenshot Options.

Service cache versus Laravel storage

ScreenshotOne’s cache=true option avoids repeat renders; its caching documentation states a default lifetime of four hours, configurable up to one month. Cached results do not consume rendering quota. Ordinary binary responses are not stored by ScreenshotOne by default unless caching, storage, or a similar feature is used. A JSON response can involve temporary storage to provide a content URL, while configured storage options can upload output to S3-compatible storage. These are distinct from saving the returned bytes durably in Laravel with Storage. Decide whether the application needs repeat-render caching, durable application-owned files, or service-side storage, rather than assuming one provides the others. See Caching.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Run captures in a queue for longer workloads

For user-facing requests, a remote page render can take long enough that doing it synchronously is undesirable. A Laravel queued job can call the service and save the result asynchronously; queueing and retry policy are application design choices, not automatic ScreenshotOne behavior. ScreenshotOne documents that it does not automatically retry API requests, so if your job retries, use bounded attempts and backoff and ensure duplicate jobs do not create unwanted duplicate files.

The vendor’s usage endpoint reports total, available, and used request counts, along with a concurrency object. Its concurrency.remaining and concurrency.reset values describe request starts remaining in the current minute bucket, not the number of active renders. A worker scheduler can use that information to pace request starts. Consult Get Usage, Screenshot Options, and the bulk screenshots guide when designing throughput controls.

Use the generic HTTP API when you do not want the SDK

ScreenshotOne accepts GET and POST requests. The access key may be supplied as a query parameter, in a JSON body, or with the X-Access-Key header. For large HTML or Markdown input, the vendor recommends JSON POST rather than a query string; the documented maximum POST body is 100 MiB. Responses may be binary, and errors include a human-readable message, error code, and HTTP status. A Laravel HTTP-client implementation is possible, but the official PHP SDK is the documented PHP integration path. See Getting Started and Screenshot Options.

Troubleshoot common integration problems

  • Authentication fails: confirm the access key is present in the deployed environment and that configuration is not stale. Send the access key using a documented authentication method; never send the separate secret key as a request parameter.
  • Composer cannot resolve dependencies: check the installed PHP version and the SDK package’s current declared dependency constraints, then resolve any conflict with the rest of the application’s Composer dependencies.
  • The file is empty or the request failed: do not assume every response is image bytes. Inspect the HTTP status and error response before writing output to storage; ScreenshotOne errors include a message and error code.
  • Captures are slower than the controller timeout: move the work to a queue and return a job or status identifier to the caller instead of waiting for the render in a web request.
  • Repeated captures consume quota unexpectedly: use the documented cache option when reuse is appropriate, or persist results in your own storage. ScreenshotOne does not automatically retry failed requests.
  • Queue workers launch requests too quickly: use the usage endpoint’s current-minute request-start bucket for pacing; do not interpret its remaining value as active-render capacity.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Or skip the browser setup: ScreenshotNeo

If you need a screenshot API without writing your own browser-rendering setup, ScreenshotNeo offers a one-request capture endpoint. Its cleanup steps accept cookie or consent banners like a visitor and remove more than 60 known consent platforms, newsletter popups, and chat widgets; each step can be switched off. Bot checks and CAPTCHAs, blank pages, timeouts, failed loads, and cache hits are not billed, and responses identify the page verdict and billing status in headers. ScreenshotNeo also provides an MCP server with take_screenshot, get_page_info, and capture_pdf tools for AI agents.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

One cURL request saves an image:

curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp

Replace the target URL as needed. See the ScreenshotNeo documentation for parameters and response details. Its Free plan includes 1,000 screenshots a month with no card; paid plans start at $5 for 3,000. Sign up for ScreenshotNeo free.

Frequently Asked Questions

Does ScreenshotOne provide a Laravel package?

The cited vendor materials document a PHP SDK and generic HTTP API, not a Laravel-specific first-party package.

Can I use the SDK to get a URL instead of saving bytes?

Yes. ScreenshotOne’s PHP SDK guide demonstrates generating a request URL from the configured options.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.