ScreenshotNeo

BlogComparisons

Apify Website Screenshot Actor vs ScreenshotOne: Which API Is Easier to Use?

Compare the documented setup, authentication, capture options, outputs, and pricing for Apify’s screenshot Actors and ScreenshotOne—and see where ScreenshotNeo fits.

By the ScreenshotNeo team4 October 202613 min read

Short answer: ScreenshotOne looks easier to start with if you want a direct screenshot request: its getting-started guide centers on a GET or POST to one /take endpoint. Apify may be easier if you already use its Actor platform or need its run and dataset workflow. “Apify Website Screenshot Actor” is not one uniquely defined product, though: capabilities, inputs, and pricing depend on the specific Store Actor you choose.

This comparison is based on published documentation and listings, not hands-on testing. No measured comparison of speed, image accuracy, or ease of use is available in the reviewed sources. If you want a direct screenshot API with cookie-banner cleanup, usage-based billing rules that exempt failed or unclean captures, and an MCP server for AI agents, ScreenshotNeo is another option to evaluate.

1. What “easier to use” means here

For a first successful capture, ease of use usually comes down to four things: how many steps the documented flow requires, what you send, how you authenticate, and how you retrieve the image.

Question ScreenshotOne Apify Store Actor
What starts the work? A GET or POST to https://api.screenshotone.com/take. An API request starts a run of a particular Actor.
What do you send? Options such as an access key and a URL, HTML, or Markdown input. Actor-specific JSON input. The reviewed i-Scraper Actor accepts a urls array and a format.
How do you get the result? The screenshot request returns image bytes. The run can expose results through a dataset, including via synchronous run-and-get-dataset-items flows.
Is there one fixed option set? The endpoint has a documented options reference. No. Inputs and capabilities vary by Store Actor.

So, for a single image that your application needs immediately, ScreenshotOne’s documented first-request flow has fewer visible workflow concepts. For a batch or an existing Apify pipeline, an Actor run and dataset can fit naturally. Those are conclusions from the published flows, not claims about measured usability.

2. ScreenshotOne: direct request workflow

ScreenshotOne documents both GET requests with query-string options and POST requests with JSON options. Its guide says the POST body limit is 100 MiB and recommends JSON for large HTML or Markdown inputs instead of putting that content in a URL. Screenshot responses are binary, with a content type matching the requested format. Every request needs an access_key; a signature is optional unless signed requests are required in account settings. At least one of URL, HTML, or Markdown must be supplied.

GET request with cURL

curl -G 'https://api.screenshotone.com/take' \
  --data-urlencode 'access_key=YOUR_SCREENSHOTONE_ACCESS_KEY' \
  --data-urlencode 'url=https://example.com' \
  --data-urlencode 'full_page=true' \
  --data-urlencode 'format=png' \
  -o screenshot.png

Use --data-urlencode for the URL and other values so reserved characters are encoded. Keep the key in an environment variable or secret store in production; do not commit it or publish it in client-side code.

POST request with Python

import os
import requests

endpoint = "https://api.screenshotone.com/take"
options = {
    "access_key": os.environ["SCREENSHOTONE_ACCESS_KEY"],
    "url": "https://example.com",
    "full_page": "true",
    "format": "png",
}

response = requests.post(endpoint, json=options, timeout=90)
response.raise_for_status()
with open("screenshot.png", "wb") as image_file:
    image_file.write(response.content)

Set SCREENSHOTONE_ACCESS_KEY in your shell or deployment secret manager before running the script. The options documentation covers additional rendering controls and authorization for protected pages; check the exact supported option names and values there.

POST request with Node.js

const endpoint = 'https://api.screenshotone.com/take';
const accessKey = process.env.SCREENSHOTONE_ACCESS_KEY;
if (!accessKey) throw new Error('Set SCREENSHOTONE_ACCESS_KEY');

const response = await fetch(endpoint, {
  method: 'POST',
  headers: { 'content-type': 'application/json' },
  body: JSON.stringify({
    access_key: accessKey,
    url: 'https://example.com',
    full_page: 'true',
    format: 'png'
  })
});
if (!response.ok) {
  throw new Error(`ScreenshotOne request failed: ${response.status} ${await response.text()}`);
}
const bytes = Buffer.from(await response.arrayBuffer());
await (await import('node:fs/promises')).writeFile('screenshot.png', bytes);

References: ScreenshotOne Getting Started and Screenshot Options.

3. Apify: choose an Actor, then run it

Apify’s API is a REST API, but the screenshot input schema belongs to the Store Actor you select. The reviewed i-scraper/website-screenshot listing shows JSON input with a urls array and format, and demonstrates starting an Actor run and reading dataset items. The run-and-result pattern adds a step compared with a direct endpoint that returns image bytes.

Below is a runnable request shape for that listing. Replace the token with your Apify token and verify the Actor’s current schema and endpoint in its listing before using it; another screenshot Actor may require different input fields or produce a different result shape.

Run the reviewed Actor with cURL

curl -X POST \
  'https://api.apify.com/v2/acts/i-scraper~website-screenshot/runs?waitForFinish=120' \
  -H 'Authorization: Bearer YOUR_APIFY_TOKEN' \
  -H 'Content-Type: application/json' \
  --data '{"urls":["https://example.com"],"format":"png"}'

A run response identifies the run and its default dataset. To retrieve items, use the dataset endpoint shown in the response or the Actor’s documented synchronous run-and-get-dataset-items endpoint. For example, with the dataset ID returned by the run:

curl \
  -H 'Authorization: Bearer YOUR_APIFY_TOKEN' \
  'https://api.apify.com/v2/datasets/YOUR_DATASET_ID/items?clean=true&format=json'

Dataset item JSON is the Actor’s result record; follow the listing’s documented output fields to find the screenshot URL or other result reference. Do not assume every Actor returns image bytes directly or uses the same field names.

Run from Python

import os
import requests

base = "https://api.apify.com/v2"
actor = "i-scraper~website-screenshot"
headers = {
    "Authorization": f"Bearer {os.environ['APIFY_TOKEN']}",
    "Content-Type": "application/json",
}
payload = {"urls": ["https://example.com"], "format": "png"}

run_response = requests.post(
    f"{base}/acts/{actor}/runs",
    params={"waitForFinish": 120},
    headers=headers,
    json=payload,
    timeout=150,
)
run_response.raise_for_status()
run = run_response.json()["data"]
dataset_id = run["defaultDatasetId"]

items_response = requests.get(
    f"{base}/datasets/{dataset_id}/items",
    params={"clean": "true", "format": "json"},
    headers=headers,
    timeout=60,
)
items_response.raise_for_status()
print(items_response.json())  # Inspect Actor-specific result fields.

Run from Node.js

const token = process.env.APIFY_TOKEN;
if (!token) throw new Error('Set APIFY_TOKEN');
const base = 'https://api.apify.com/v2';
const actor = 'i-scraper~website-screenshot';
const headers = {
  Authorization: `Bearer ${token}`,
  'Content-Type': 'application/json'
};

const runResponse = await fetch(
  `${base}/acts/${actor}/runs?waitForFinish=120`,
  {
    method: 'POST',
    headers,
    body: JSON.stringify({ urls: ['https://example.com'], format: 'png' })
  }
);
if (!runResponse.ok) throw new Error(`Actor run failed: ${runResponse.status} ${await runResponse.text()}`);
const run = (await runResponse.json()).data;
const itemsResponse = await fetch(
  `${base}/datasets/${run.defaultDatasetId}/items?clean=true&format=json`,
  { headers }
);
if (!itemsResponse.ok) throw new Error(`Dataset read failed: ${itemsResponse.status} ${await itemsResponse.text()}`);
console.log(await itemsResponse.json()); // Inspect this Actor's output schema.

Use the Authorization: Bearer header for Apify authentication. Apify’s API docs describe token parameters in URLs as less secure because URLs can be retained in browser history or server logs. The Actor listing is the source of truth for its input and output contract.

References: Apify Website Screenshot API by i-Scraper and Apify API documentation.

4. Authentication and secret handling

Service Credential pattern Practical handling
ScreenshotOne Required access_key option; optional signature unless account settings require signed requests. Keep the key server-side. Avoid putting secrets in code committed to source control or exposed in public pages.
Apify API token; official docs recommend the Bearer authorization header. Use a secret manager or environment variable. Avoid URL token parameters because URLs can appear in logs and history.

Both flows require credentials. The difference is where the documented credential goes: a ScreenshotOne request option versus Apify’s recommended authorization header. Treat either secret as a server-side credential and rotate it according to your organization’s secret-handling policy.

5. Capture controls and input differences

ScreenshotOne

The documented endpoint accepts a URL, HTML, or Markdown input and has a broad options reference. The reviewed docs include controls such as format, full-page capture behavior, render options, and authorization headers for protected pages. That breadth lets one endpoint serve different capture needs, though an advanced request means learning more option names.

Apify Actors

Actor capabilities are specific to the listing. The reviewed i-Scraper Actor accepts a list of URLs and a format. A separate multi-resolution Actor, incredible_moment/screenshot-actor, documents a required URL plus optional mobile, tablet, desktop, custom width, full-page, format, quality, and wait-time inputs. Do not transfer one Actor’s schema to another.

For example, if you need device presets or quality controls, first inspect the exact Actor’s input schema. The multi-resolution Actor input schema demonstrates why the Actor name matters: two Store implementations can expose different controls and output conventions.

6. Operations, result handling, and scaling

ScreenshotOne’s pricing page lists caching, S3 upload, webhooks, and integrations such as Zapier and Make. Its basic request response is image data, which is convenient when the caller wants to save or stream the file immediately.

Apify’s flow centers on Actor runs and platform storage, including datasets. This is a natural fit if your work already uses Apify runs or you want to process lists of URLs through an Actor. For a single synchronous application request, account for the run wait and result retrieval steps, and decide how your application handles runs that take longer than the caller’s request window.

For either approach, use bounded timeouts, log request IDs or run IDs, and make retries deliberate. A timed-out client request does not always prove the remote work did not finish. Before retrying a potentially billable capture, check the service’s response or run state where possible, and avoid unbounded automatic retries.

7. Pricing: compare the same unit and workload

Published prices are snapshots from the research reviewed in 2026 and may change. They use different billing structures, so compare the same capture type, volume, billing period, and account conditions before choosing.

Service/listing Published price in reviewed source Unit and caveat
ScreenshotOne 100 free screenshots; Basic at $17/month for 2,000 screenshots; 40 requests/minute; $0.009 per extra screenshot. Plan and screenshot overage as listed on its pricing page.
Apify i-Scraper website-screenshot From $6 per 1,000 results. Store listing price for this Actor; not a universal Apify rate.
Apify incredible_moment screenshot-actor From $1.50 per 1,000 screenshot sets. Different Actor and a different unit (“sets”); not directly comparable to results or screenshots.

Verify current prices on the ScreenshotOne pricing page and the exact Apify Store listing. The reviewed pages do not settle every possible tax, currency, account-specific charge, or downstream storage cost. For Apify, also determine what one billed result or set represents for your Actor and whether any platform or account charges apply.

8. Which API is easier for your situation?

Your situation Likely simpler fit based on documented flow Why
You need one screenshot returned to your app ScreenshotOne The quick start sends a request to /take and receives image bytes.
You already orchestrate work with Apify Actors Apify may fit more naturally Runs and datasets are part of the platform workflow you already use.
You need several URLs in one Actor input Check the chosen Apify Actor The reviewed i-Scraper listing accepts a urls array; input capacity is Actor-specific.
You need HTML or Markdown as the input ScreenshotOne Its documented options explicitly include URL, HTML, or Markdown.
You need a particular device or quality control Compare exact option schemas ScreenshotOne has a general options reference; Actor controls vary by implementation.

In short, ScreenshotOne has the more direct documented first request. Apify can be the easier operational choice when an Actor run and dataset match your existing pipeline. For another direct API option, put ScreenshotNeo first on your shortlist if clean captures, clear billing outcomes, or AI-agent access matter.

9. ScreenshotNeo: a direct alternative to try first

ScreenshotNeo is a website screenshot API and MCP server from Yorker Media. Its API takes a GET request and returns an image or PDF. It is worth trying first when you want a direct request and want consent banners, newsletter popups, and chat widgets removed before capture; its documented cleanup accepts cookie/consent banners and removes 60+ known consent platforms, and each step can be turned off. Bot checks/CAPTCHAs, blank pages, timeouts, failed loads, and cache hits cost nothing, and each response reports the page verdict and billing status in headers.

It also offers an MCP server with take_screenshot, get_page_info, and capture_pdf tools for Claude, Cursor, and other MCP clients. The free plan includes 1,000 shots per month with no card; paid plans start at $5 for 3,000 shots. Every feature is on every plan. See the ScreenshotNeo API documentation for request options.

One-call examples

Set YOUR_API_KEY to your ScreenshotNeo key. These examples use the supplied API pattern; the cURL and Python examples save the returned bytes as WebP.

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

r = requests.get(
    "https://api.screenshotneo.com/v1/shot",
    params={"access_key": "YOUR_API_KEY", "url": "https://stripe.com"},
    timeout=90,
)
r.raise_for_status()
with open("shot.webp", "wb") as f:
    f.write(r.content)
const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://stripe.com' });
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);
if (!res.ok) throw new Error(`ScreenshotNeo request failed: ${res.status}`);
const bytes = Buffer.from(await res.arrayBuffer());
await (await import('node:fs/promises')).writeFile('shot.webp', bytes);

Keep the API key on the server when using these examples in an application. ScreenshotNeo supports full-page captures with lazy images loaded, CSS-selector element capture, dark mode, device presets and custom viewports, retina scale, PDF settings, HTML/CSS input, custom CSS and JavaScript, click and hide selectors, wait conditions, request and resource blocking, custom headers/cookies/user agent/authorization, timezone and geolocation, transparent backgrounds, resizing, configurable caching, signed public image links, async jobs with signed webhooks, up to 100 URLs per bulk call, a usage API, and an OpenAPI spec. Parameter names used by other screenshot APIs also work, which can make migrations easier.

Plans: Free, 1,000 shots/month with no card; Starter, $5 for 3,000; Growth, $15 for 15,000; Pro, $39 for 60,000; Scale, $99 for 250,000; Business, $249 for 1,000,000. Yearly billing gives two months free.

Start with 1,000 screenshots a month free, with no card: Create a free ScreenshotNeo account.

10. Troubleshooting common integration problems

Symptom Likely cause What to do
ScreenshotOne rejects the request for missing input No URL, HTML, or Markdown input was provided. Send at least one supported input and check spelling against the options reference.
ScreenshotOne authentication fails Missing/incorrect access key, or account settings require a signature. Check the key and signed-request setting. Keep credentials out of public code.
ScreenshotOne request URL becomes unwieldy or breaks Large HTML/Markdown or unencoded query values. Use POST JSON for large input (within the documented 100 MiB body maximum); URL-encode GET values.
Apify run starts but expected screenshot is missing The selected Actor has a different output schema, or results were not read from its dataset. Inspect that Actor’s listing, run response, default dataset ID, and result item fields.
Apify returns an input validation error Fields from another Actor were sent, or the input type/value differs from its schema. Use the exact Actor’s input schema; do not assume all screenshot Actors accept the same keys.
Apify authentication fails Invalid token or token sent in the wrong place. Use a valid token in the recommended Authorization: Bearer header.
Client times out while capture continues The page or Actor run took longer than the client’s timeout. Choose a suitable timeout, check the remote run/result state before retrying, and consider an asynchronous workflow when available.
Downloaded file is JSON or an error page rather than an image The request returned an error response or a dataset record instead of image bytes. Check HTTP status and content type before saving. For Apify, follow the Actor’s output reference to the image.

11. Performance, reliability, and cost checks before production

  • Measure your workload: render time depends on target pages and requested capture behavior. The reviewed sources provide no comparative latency benchmark, so test representative pages in your own environment before setting user-facing deadlines.
  • Control concurrency: ScreenshotOne’s listed Basic plan specifies 40 requests per minute. Check current plan limits and the exact Actor/platform limits for Apify before sizing a queue.
  • Make retries bounded: retry transient network or service errors with a cap and backoff. Avoid retrying every timeout immediately, since the remote request may already have completed.
  • Track output size and retention: full-page images and PDFs can be larger than viewport captures. Decide where results are stored and how long they are retained; Apify datasets and ScreenshotOne’s listed S3 option may affect the workflow.
  • Estimate cost using the actual unit: calculate monthly volume against screenshots, results, or sets as the provider defines them. Do not compare Apify’s per-result and per-set examples as equivalent.
  • Record outcome details: log status, elapsed time, and a request/run identifier without logging credentials. For Apify, retain run and dataset IDs; for direct endpoints, preserve response metadata useful for diagnosing failures.

12. Frequently asked questions

Is Apify’s Website Screenshot Actor a single official API?

The phrase does not identify one unique Store implementation. Apify has multiple screenshot Actors, so select and name the exact listing and use its schema and price.

Can I send HTML instead of a URL?

ScreenshotOne’s reviewed options documentation supports URL, HTML, or Markdown input. The reviewed Apify examples are Actor-specific URL inputs; check the chosen Actor before assuming it accepts HTML.

Which service is faster?

The reviewed documentation does not establish comparative speed. Capture timing depends on the page, capture options, and workflow; measure with your own representative URLs.

Can I compare the listed prices directly?

No. ScreenshotOne lists plans and screenshot overages, while the cited Apify Actors quote per result or per screenshot set. Confirm each billing unit and current account charges first.

Is the ease-of-use verdict based on a hands-on test?

No. It is an inference from the published setup flows: direct request and image response versus Actor run and dataset retrieval.