Best Low-Cost Ways to Schedule Website Screenshots on an Indian Cloud Server
Compare India-region cloud options, estimate costs, and build a scheduled Playwright screenshot workflow you can size against your real workload.
Short answer: A small Linux VPS is a practical low-cost way to schedule website screenshots in an Indian cloud region. AWS Lightsail publishes monthly bundles starting at $5, while Google Cloud lists Compute Engine regions in Mumbai and Delhi. These figures do not establish a universal cheapest option or a proven minimum server size for browser automation. Compare the live price, region-specific transfer allowance, disk, and tax for your workload, then run Playwright sequentially and measure memory and run time on the actual sites.
For an unattended workflow, the basic pieces are a Linux VM, Playwright with its matching browser and system dependencies, a scheduled command, and enough disk for the files you retain. If maintaining a browser runtime is more work than the screenshots justify, ScreenshotNeo provides a screenshot API and MCP server; the one-call option is below.
1. Compare the low-cost hosting options
Start with the all-in requirements rather than the headline monthly compute price. The table gives published AWS Lightsail Linux/Unix public IPv4 bundle figures and the known India-region alternative. Verify current pricing and terms before choosing: cloud prices and transfer terms can change.
| Option | Published details | What to check |
|---|---|---|
| AWS Lightsail $5 bundle | 0.5 GB memory, 2 vCPUs, 20 GB SSD, listed 1 TB transfer | AWS says Mumbai plans include half the transfer allowance shown in its bundles. Treat 0.5 GB as a price reference, not as a verified Playwright recommendation. |
| AWS Lightsail $7 bundle | 1 GB memory, 2 vCPUs, 40 GB SSD, listed 2 TB transfer | Confirm the Mumbai allowance, any overage terms, applicable taxes, and whether the browser workload fits. |
| AWS Lightsail $12 bundle | 2 GB memory, 2 vCPUs, 60 GB SSD, listed 3 TB transfer | Confirm regional transfer terms and the current invoice details. |
| Google Cloud Compute Engine | India regions include Mumbai (asia-south1) and Delhi (asia-south2). | Use the official calculator for the selected machine type, zone, disk, and transfer assumptions. The reviewed pricing information does not supply a directly comparable machine-specific total. |
AWS describes Lightsail bundles as including compute, memory, disk, and a transfer allowance, with hourly billing up to a monthly plan cap. AWS documentation also says each bundle includes public IP addressing. Its listed bundle transfer amounts are not the Mumbai amounts: the Mumbai allowance is half the displayed figure. See AWS Lightsail pricing and the Lightsail instance bundle documentation. Google Cloud’s general-purpose VM pricing information lists its regional pricing approach and India locations; use its Compute Engine pricing page for a current estimate.
Do not compare only monthly compute charges. Include persistent disk, snapshots or other storage you choose, outbound transfer, taxes, and any additional services. This research does not provide INR conversions, tax-inclusive totals, or a like-for-like Google Cloud machine price. It therefore cannot identify the cheapest all-in Indian VM.
2. Size the server against the actual screenshot workload
There is no supported universal minimum RAM figure for Playwright screenshots. Page complexity, image loading, browser version, concurrency, viewport, and the number of open pages all affect resource use. A small published VPS bundle is a candidate to evaluate, not proof that a browser run will be reliable on it.
- Count the URLs and captures per day, including retries, and decide how long to retain the output.
- Select a Mumbai or Delhi region based on your latency, residency, and provider requirements, then check current price and transfer allowance.
- Install Playwright and the matching browser binaries and operating-system dependencies using the official instructions.
- Run one capture at a time first. Record peak memory, run duration, disk growth, and failed pages during representative scheduled runs.
- Increase the VM size, reduce page concurrency, or spread jobs across the schedule if the observed workload needs it.
This is an evaluation method inferred from the documented browser setup and stability guidance, not a provider benchmark. The Playwright CI guide recommends one worker for stability in CI environments. For container execution, Playwright recommends using --init and suggests --ipc=host for Chromium because it can otherwise run out of memory and crash. Read the project’s Docker documentation if using its container image.
3. Install Playwright and capture a page
The following is a runnable Node.js script for a Linux VM after Node.js is installed. Playwright installation commands and browser dependencies are operating-system-specific; use the official installation guidance for your distribution. The script captures a full page to a timestamped PNG and closes the browser even if navigation or capture fails.
npm init -y
npm install playwright
npx playwright install --with-deps chromium
// screenshot.mjs
import { chromium } from 'playwright';
import { mkdir } from 'node:fs/promises';
const target = process.argv[2] ?? 'https://example.com';
const outDir = process.env.SCREENSHOT_DIR ?? './screenshots';
const timeoutMs = Number(process.env.NAVIGATION_TIMEOUT_MS ?? 60000);
await mkdir(outDir, { recursive: true });
const browser = await chromium.launch({ headless: true });
try {
const page = await browser.newPage({ viewport: { width: 1440, height: 1000 } });
const response = await page.goto(target, {
waitUntil: 'networkidle',
timeout: timeoutMs
});
if (!response || !response.ok()) {
throw new Error(`Navigation failed${response ? `: HTTP ${response.status()}` : ''}`);
}
const filename = `${new Date().toISOString().replaceAll(':', '-')}.png`;
await page.screenshot({ path: `${outDir}/${filename}`, fullPage: true });
console.log(`Saved ${outDir}/${filename}`);
} finally {
await browser.close();
}
Save it as screenshot.mjs and run node screenshot.mjs https://example.com. networkidle can be unsuitable for sites that keep connections open or continuously poll; if that occurs, use domcontentloaded and a site-specific wait condition, or a deliberate short delay. For long pages with lazy-loaded media, a full-page screenshot may not cause every site to load content that only appears after scrolling. Add scrolling or site-specific waits when the target requires it, and inspect output rather than assuming every capture is complete.
4. Schedule the capture with cron
For a daily run, use an absolute path to Node and the script, and redirect output to a log you rotate or bound. Check the VM’s timezone; cron uses the machine’s local time. The example runs at 02:15 server time every day:
15 2 * * * cd /home/ubuntu/site-capture && /usr/bin/node screenshot.mjs https://example.com >> /home/ubuntu/site-capture/capture.log 2>&1
Replace /home/ubuntu/site-capture and /usr/bin/node with the actual paths. Confirm the Node path with command -v node. Create the directory and ensure the cron user can write both screenshots and logs. For multiple URLs, keep the first version sequential: one failed site should be logged without preventing later URLs from running. Add explicit retry limits and a retention policy instead of retrying indefinitely or accumulating files without a bound.
5. Make scheduled runs dependable
- Bound the job: set navigation and job timeouts, and cap retries. A site can stall indefinitely if the script has no timeout.
- Keep jobs isolated: use a dedicated output directory per run or a predictable naming scheme so concurrent runs do not overwrite files.
- Log useful context: record target URL, timestamp, elapsed time, HTTP status when available, and the error. Avoid logging credentials or sensitive page content.
- Limit concurrency: start with one browser worker and raise it only after observing memory under representative load.
- Manage disk: estimate retained output as captures per day × average image size × retention days. Remove or archive old files according to your retention needs.
- Check failures explicitly: a process exit code, file existence, and nonzero file size are useful basic signals; also review a sample of images for blank or incomplete captures.
- Protect access: restrict SSH access and file permissions, and keep API credentials or site credentials out of source code and logs.
A VPS gives you control over scheduling and storage, but you maintain the OS, browser runtime, dependencies, and scheduler. Reliability depends on the chosen workload and maintenance. The cited provider and Playwright documents do not guarantee a particular screenshot success rate or browser capacity for a given bundle.
6. Cost and performance trade-offs
A low monthly bundle can make costs predictable, but the smallest plan may have little headroom for Chromium plus a memory-heavy page. Browser crashes or swapping can make a nominally cheaper VM costly in missed or delayed captures. Measure representative pages at the intended schedule before committing to a size. Likewise, use the region’s actual transfer allowance: Mumbai Lightsail plans have half the allowance displayed in the bundle table.
Keep capture frequency proportional to the change you need to observe. Sequential runs reduce peak resource use but increase total schedule duration. Retaining only the images you need controls disk growth. If frequent screenshots of many sites make browser installation, patching, and job monitoring a burden, compare that operational time with a screenshot API price; do not assume that any cloud bundle price represents total workflow cost.
7. Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
| Chromium fails to launch or reports missing libraries | Browser binaries or OS dependencies are absent or do not match the installed Playwright version. | Install the browser through Playwright and install the system dependencies for the VM’s distribution. Follow the official setup instructions. |
| Browser exits unexpectedly, especially on the smallest VM | Memory pressure; Chromium can run out of memory, especially with concurrent pages. | Reduce concurrency to one, inspect memory use, and evaluate a larger VM. In Docker, apply Playwright’s documented --init and Chromium IPC guidance. |
| Navigation times out | The site is slow, blocked, or never reaches the chosen load condition; persistent network activity can prevent networkidle. |
Use a realistic timeout and a more suitable readiness condition such as domcontentloaded, followed by a targeted selector wait if needed. |
| Screenshot is blank or incomplete | Navigation did not finish, content loads after interaction or scrolling, or the page returned an error. | Check HTTP status and logs, wait for the relevant content, scroll to trigger lazy loading, and review the saved image. |
| Works in an SSH shell but not cron | Cron has a limited environment, different working directory, PATH, user, or timezone. | Use absolute executable and file paths, set required environment variables explicitly, and check cron logs and file permissions. |
| Output files overwrite each other | The filename is static or two scheduled runs overlap. | Use timestamped names and prevent overlapping runs or assign each run its own directory. |
| Disk fills over time | Images and logs have no retention limit. | Estimate storage growth, rotate logs, and prune or archive captures beyond the chosen retention period. |
8. Or skip the browser setup
ScreenshotNeo turns a URL into a PNG, JPEG, WebP, or PDF with one GET request. Its cookie-consent handling accepts the banner as a visitor and removes more than 60 known consent platforms, newsletter popups, and chat widgets before capture; each step can be turned off. Bot checks and CAPTCHAs, blank pages, timeouts, failed loads, and cache hits cost nothing, and the response includes X-Page-Verdict and X-Billed headers. Its MCP server gives AI agents tools for taking screenshots, getting page information, and capturing PDFs.
See the ScreenshotNeo API documentation for parameters and options. The following uses the documented request shape with the target URL from this guide:
cURL
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://example.com -o shot.webp
Python
import requests
r = requests.get(
"https://api.screenshotneo.com/v1/shot",
params={"access_key": "YOUR_API_KEY", "url": "https://example.com"},
timeout=90,
)
open("shot.webp", "wb").write(r.content)
Node.js
const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://example.com' });
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);
if (!res.ok) throw new Error(`Screenshot request failed: ${res.status}`);
await Bun.write('shot.webp', res);
The Node.js example uses Bun’s file writer to save the response. With Node.js alone, replace the last line with:
import { writeFile } from 'node:fs/promises';
await writeFile('shot.webp', Buffer.from(await res.arrayBuffer()));
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, pre-capture clicks, hidden selectors, selector/delay/network-idle waits, request and resource blocking, custom headers, cookies, user agent and Authorization, timezone and geolocation, transparent backgrounds, image resizing, configurable cache TTL, signed public image links, asynchronous jobs with signed webhooks, bulk capture up to 100 URLs per call, a usage API, and an OpenAPI spec. It also accepts parameter names used by other screenshot APIs to ease migration. See the docs for exact parameter syntax.
ScreenshotNeo includes 1,000 screenshots a month free with no card. Paid plans are Starter at $5 for 3,000, Growth at $15 for 15,000, Pro at $39 for 60,000, Scale at $99 for 250,000, and Business at $249 for 1,000,000; yearly billing gives two months free, and every feature is on every plan. Sign up for 1,000 free screenshots a month with no card.
9. Frequently asked questions
Does the server have to be physically in India?
That depends on your latency, residency, and organizational requirements. AWS and Google Cloud publish India-region options described above; confirm the selected service’s current region and terms before creating the VM.
Can I use the $5 Lightsail bundle for Playwright?
It is a published price point, not a documented minimum for Playwright. Test your actual pages and schedule, especially peak memory and browser stability, before relying on it.
Should I use cron or a managed scheduler?
Cron is a simple choice for a single VM and recurring command. A managed scheduler may suit a larger system, but its price and setup are outside the figures established here; compare the complete setup you plan to operate.
Is a screenshot API cheaper than a VPS?
It depends on capture volume and whether you count the time spent maintaining the browser, VM, scheduler, and storage. Compare the relevant plan allowance and your operational requirements rather than compute price alone.
How many screenshots can the smallest VM take per day?
There is no fixed supported number. Page complexity and run frequency vary; measure run time and memory using the sites you intend to capture.


