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

Use chrome.tabs.captureVisibleTab() to obtain an image of the active tab’s currently visible area, then pass that image URL to chrome.downloads.download() to save a file. The two APIs are separate: capture creates the image representation, while Downloads writes a URL to disk. This workflow needs activeTab (or <all_urls>) for capture and the downloads permission for saving. It is not a full-page screenshot API, and Chrome documents a maximum of two capture calls per second.

What the capture-and-download workflow actually does

chrome.tabs.captureVisibleTab(windowId?, options?) returns a Promise that resolves to a string representing an image. If you omit windowId, Chrome uses the current window. The captured pixels are the visible page area in that tab at that moment; the method does not automatically scroll through the document or stitch a full-page image.

A download is a second operation: chrome.downloads.download(options) receives a URL, optionally a relative filename, and an optional saveAs flag. On success it returns the new download ID. Treat the connection between the capture result and the download URL as an implementation detail to verify in the Chrome version and extension context you support. The API references document each method independently; they do not guarantee that every data-URL or object-URL conversion behaves identically in every context.

Permissions and access scope

Capture permission

  • activeTab grants temporary access to the tab after a user invocation, such as clicking the extension action. It is usually the narrowest choice for an action-triggered screenshot.
  • <all_urls> is the broader alternative when the extension must capture pages without relying on a user invocation. Request it only when the product really needs capture access across sites.
  • For file:// pages, the user must also enable the extension’s file access in Chrome’s extension-management UI.

Download permission

Add downloads before calling chrome.downloads.download. The permission controls the save operation; it does not replace the host access needed for capture.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
#1 Best Overall
Amazon Basics Wired QWERTY Keyboard, Works with Windows, Plug and Play, Easy to Use with Media Control, Full-Sized, Black
  • KEYBOARD: The keyboard works for Windows with hot keys that enable easy access to Media, My Computer, Mute, Volume up/down, and Calculator
  • EASY SETUP: Experience simple installation with the USB wired connection
  • VERSATILE COMPATIBILITY: This keyboard is designed to work with multiple Windows versions, including Vista, 7, 8, 10 offering broad compatibility across devices.
  • SLEEK DESIGN: The elegant black color of the wired keyboard complements your tech and decor, adding a stylish and cohesive look to any setup without sacrificing function.
  • FULL-SIZED CONVENIENCE: The standard QWERTY layout of this keyboard set offers a familiar typing experience, ideal for both professional tasks and personal use.

Minimal Manifest V3 extension

The following files implement a user-invoked capture. Clicking the toolbar action grants activeTab, captures the visible area, and asks Chrome to save the returned URL. Test the URL hand-off on the exact Chrome release and context you target before shipping.

manifest.json

{
  "manifest_version": 3,
  "name": "Visible Tab Saver",
  "version": "1.0.0",
  "description": "Capture and download the visible area of the active tab.",
  "permissions": ["activeTab", "downloads"],
  "background": { "service_worker": "service-worker.js" },
  "action": { "default_title": "Save visible screenshot" }
}

service-worker.js

chrome.action.onClicked.addListener(async (tab) => {
  if (!tab.windowId) {
    console.error('The clicked tab has no usable window ID.');
    return;
  }

  try {
    const imageUrl = await chrome.tabs.captureVisibleTab(
      tab.windowId,
      { format: 'png' }
    );

    // Verify that your target Chrome version accepts this returned URL
    // directly in chrome.downloads.download in your extension context.
    const downloadId = await chrome.downloads.download({
      url: imageUrl,
      filename: 'screenshots/visible-' + Date.now() + '.png',
      saveAs: false
    });

    console.log('Started download', downloadId);
  } catch (error) {
    console.error('Capture or download failed', error);
  }
});

Load the directory from chrome://extensions with Developer mode enabled, click “Load unpacked,” then click the extension action while the page you want is active. The filename is relative to Chrome’s Downloads directory, so Chrome creates or uses the screenshots subdirectory according to its normal download rules.

Choosing image options and filenames

PNG versus JPEG

Pass an options object to request the format supported by your target Chrome version, for example {format: 'png'} or {format: 'jpeg', quality: 85}. PNG preserves sharp text and transparency-like edges; JPEG generally produces smaller files but introduces lossy compression. Confirm the resulting extension and MIME handling in your own tests rather than assuming a filename alone changes the encoded bytes.

Save immediately or ask the user

Set saveAs: true to request a Save As dialog. If you also provide filename, Chrome documents that the dialog is pre-populated with that suggested path. With saveAs: false (or when omitted), Chrome starts the download using the configured download behavior.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Rank #2
Sale
Logitech MK270 Full Size Wireless Keyboard and Mouse Combo - Black
  • Reliable Plug and Play: The USB receiver provides a reliable wireless connection up to 33 ft (1), so you can forget about drop-outs and delays and you can take it wherever you use your computer
  • Type in Comfort: The design of this keyboard creates a comfortable typing experience thanks to the low-profile, quiet keys and standard layout with full-size F-keys, number pad, and arrow keys
  • Durable and Resilient: This full-size wireless keyboard features a spill-resistant design (2), durable keys and sturdy tilt legs with adjustable height
  • Long Battery Life: MK270 combo features a 36-month keyboard and 12-month mouse battery life (3), along with on/off switches allowing you to go months without the hassle of changing batteries
  • Easy to Use: This wireless keyboard and mouse combo features 8 multimedia hotkeys for instant access to the Internet, email, play/pause, and volume so you can easily check out your favorite sites

Use deterministic names

Include a timestamp, tab title after sanitizing it, or a sequence number to avoid collisions. Keep the path relative and avoid characters that are illegal on the user’s operating system. The API returns a download ID, which you can log for diagnostics.

Making capture automatic without exceeding Chrome’s limit

Chrome documents MAX_CAPTURE_VISIBLE_TAB_CALLS_PER_SECOND as two calls per second and describes capture as expensive. Do not run an unrestricted setInterval loop. A safer design is a single-flight queue that records the last capture time and refuses or delays work until at least 500 milliseconds have elapsed.

let lastCaptureAt = 0;
let captureInProgress = false;

async function captureAndDownload(windowId) {
  const now = Date.now();
  if (captureInProgress || now - lastCaptureAt < 500) {
    return { skipped: true, reason: 'rate-limit' };
  }

  captureInProgress = true;
  lastCaptureAt = now;
  try {
    const imageUrl = await chrome.tabs.captureVisibleTab(windowId, {
      format: 'jpeg',
      quality: 85
    });
    const id = await chrome.downloads.download({
      url: imageUrl,
      filename: 'screenshots/auto-' + Date.now() + '.jpg',
      saveAs: false
    });
    return { skipped: false, id };
  } finally {
    captureInProgress = false;
  }
}

Call this function from a scheduler that matches your product’s needs, and decide what should happen when a capture is skipped. For long-running automation, account for extension service-worker suspension and page navigation; persist scheduling state or use the scheduling mechanism appropriate for your manifest and Chrome versions. Never assume that a background loop will remain alive indefinitely.

Visible area, active tab, and timing edge cases

  • Viewport only: browser chrome, other tabs, and content below the viewport are not part of the page image. A full-page result requires a different technique, such as page-side scrolling and stitching, and is outside captureVisibleTab itself.
  • Active-window changes: capture the intended window ID and check that the tab is still the one your workflow selected. A user switching windows between scheduling and capture can otherwise produce an unexpected image.
  • Navigation races: a navigation, closed tab, or page transition can make a pending capture fail. Catch the Promise rejection and retry only after applying your rate policy.
  • Restricted pages: pages that Chrome does not expose to extensions, or file URLs without the user’s file-access approval, can fail even when your JavaScript is correct.
  • Dynamic rendering: wait for the state you want before invoking capture. The API takes a snapshot of the current pixels; it does not wait for a framework, animation, or lazy image to settle.

Troubleshooting common failures

“The method is not available” or a permission error

Check that the code runs in an extension context with the required manifest permission and that you are calling the Tabs API from a supported extension page or service worker. For a click-driven flow, confirm the action click happened before relying on activeTab.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Rank #3
Sale
Logitech K120 Full Size Wired Keyboard USB Plug-and-Play Windows - Black
  • All-day Comfort: The design of this standard keyboard creates a comfortable typing experience thanks to the deep-profile keys and full-size standard layout with F-keys and number pad
  • Easy to Set-up and Use: Set-up couldn't be easier, you simply plug in this corded keyboard via USB on your desktop or laptop and start using right away without any software installation
  • Compatibility: This full-size keyboard is compatible with Windows 7, 8, 10 or later, plus it's a reliable and durable partner for your desk at home, or at work
  • Spill-proof: This durable keyboard features a spill-resistant design (1), anti-fade keys and sturdy tilt legs with adjustable height, meaning this keyboard is built to last
  • Plastic parts in K120 include 51% certified post-consumer recycled plastic*

Capture works on websites but not on a local file

Open the extension’s details in chrome://extensions and enable “Allow access to file URLs.” Chrome requires this additional user grant for file pages.

Capture succeeds but saving fails

Verify that downloads is declared, inspect the rejected error in the service-worker console, and test the exact returned string as the download URL in your target Chrome version. The official references define the capture return as a string and the download input as a URL, but do not promise one universal conversion path for every context.

Only some scheduled shots appear

Measure the interval between calls, enforce the two-per-second ceiling, and prevent overlapping captures. Also check whether the service worker was suspended, the tab navigated, or the page became unavailable. Log the returned download ID and each caught exception so skipped work is distinguishable from failed work.

The screenshot is blank or shows an intermediate state

Capture after the page reaches the visual state you need. For applications with transitions, wait for a selector or an application signal in your extension’s own logic; do not solve the problem by firing calls faster.

Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Rank #4
Redragon K521 Upgrade Rainbow LED Gaming Keyboard, 104 Keys Wired Mechanical Feeling Keyboard with Multimedia Keys, One-Touch Backlit, Anti-Ghosting, Compatible with PC, Mac, PS4/5, Xbox
  • 【Dreamy Rainbow Gaming Keyboard】K521 Gaming Keyboard Adopts a Different LED Backlight Design, Upgraded on the Traditional LED Backlight Effect, Making the Light More Penetrating, Giving You a More Dazzling Visual Effect, Making Your Gaming Process More Enjoyable
  • 【One Touch Opens & Visual Feast】The K521 Red Dragon Keyboard has a One-Touch on/off Lighting Button for Added Convenience. It also has a Three-Position Adjustable Breathing Mode and a Four-Position Adjustable Brightness Lighting Mode
  • 【Mechanical Feeling & Fast Tapping】The PC Keyboard Keys are Designed for Mechanical Feeling, Giving You a Better Feel During Use and the Ability to Trigger Keys Quickly, Allowing You to Win All Your Games
  • 【19 Keys Anti-Ghosting Keyboard】Anti-Ghosting Ensures Every Button Can Be Triggered. This Allows You to Trigger Key Combinations In The Game Accurately, And Each Skill Can Be Accurately Released to Increase Your Winning Rate. Redragon K521 Will Be Your Perfect Partner
  • 【12 Multimedia Combination Keys】The K521 Wired Gaming Keyboard is Equipped with 12 Multimedia Keys That Can Greatly Enhance Your Gaming/Office Efficiency and Make It More Convenient to Use
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 provides a website screenshot API and MCP server for developers. One GET request returns a PNG, JPEG, WebP, or PDF, so you do not need to maintain a Chrome extension just to capture a URL. See the ScreenshotNeo documentation for the complete parameter reference.

cURL

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

Python

import requests
r = requests.get("https://api.screenshotneo.com/v1/shot", params={"access_key": "YOUR_API_KEY", "url": "https://stripe.com"}, timeout=90)
open("shot.webp", "wb").write(r.content)

Node.js

const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://stripe.com' });
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);

Before capture, ScreenshotNeo accepts cookie or consent banners and removes more than 60 known consent platforms, newsletter popups, and chat widgets; each cleanup step can be disabled. Bot checks, CAPTCHAs, blank pages, timeouts, failed loads, and cache hits are not billed, and response headers report the page verdict and billing status through X-Page-Verdict and X-Billed. Its MCP server exposes take_screenshot, get_page_info, and capture_pdf to Claude, Cursor, and other MCP clients.

Other controls include full-page capture with lazy images loaded, CSS-selector element capture, dark mode, 12 device presets or custom viewports, retina scale, PDF paper and page-range settings, HTML/CSS rendering, custom JavaScript and CSS, click-before-capture, hidden selectors, selector/delay/network-idle waits, ad and tracker blocking, custom headers/cookies/user agents/Authorization, timezone and geolocation, transparent backgrounds, resizing, selectable cache TTLs, signed image links, asynchronous jobs with signed webhooks, bulk capture for up to 100 URLs per call, usage reporting, an OpenAPI specification, and compatibility with parameter names used by other screenshot APIs.

Plan Included screenshots Price
Free 1,000 per month $0; no card
Starter 3,000 $5
Growth 15,000 $15
Pro 60,000 $39
Scale 250,000 $99
Business 1,000,000 $249

Every feature is available on every plan, and yearly billing provides two months free. Create a free ScreenshotNeo account to get 1,000 screenshots each month with no card required; paid plans start at $5 for 3,000 screenshots.

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

When to use each approach

Choose captureVisibleTab when the screenshot must reflect an interactive Chrome session, the user’s current viewport, or extension-controlled state. Choose a server-side API when you need repeatable URL capture, PDF output, bulk jobs, cleanup of consent UI, or an AI-agent workflow without browser-permission and service-worker concerns. In either case, design around timing, failures, and the distinction between a viewport image and a full-page document.

Best Value
Sale
Logitech K270 Full Size Wireless Keyboard for Windows - Black
  • All-day Comfort: This USB keyboard creates a comfortable and familiar typing experience thanks to the deep-profile keys and standard full-size layout with all F-keys, number pad and arrow keys
  • Built to Last: The spill-proof (2) design and durable print characters keep you on track for years to come despite any on-the-job mishaps; it’s a reliable partner for your desk at home, or at work
  • Long-lasting Battery Life: A 24-month battery life (4) means you can go for 2 years without the hassle of changing batteries of your wireless full-size keyboard
  • Simply plug the USB receiver into a USB port on your desktop, laptop or netbook computer and start using the keyboard right away without any software installation
  • Simply Wireless: Forget about drop-outs and delays thanks to a strong, reliable wireless connection with up to 33 ft range (5); K270 is compatible with Windows 7, 8, 10 or later

Frequently Asked Questions

Can I capture a page that is not currently visible?

No. The method captures the visible area of a tab in a window at capture time; an off-screen or full-document result requires a different workflow.

What does the download promise return?

On success, chrome.downloads.download() resolves to the new download ID, which you can record for diagnostics or later download-state handling.

Is two calls per second a recommendation or a documented limit?

Chrome documents two captureVisibleTab calls per second as the maximum and describes the operation as expensive, so treat it as a hard design boundary rather than a target rate.

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

Quick Recap

Bestseller No. 1
SaleBestseller No. 3
Logitech K120 Full Size Wired Keyboard USB Plug-and-Play Windows - Black
Logitech K120 Full Size Wired Keyboard USB Plug-and-Play Windows - Black
Plastic parts in K120 include 51% certified post-consumer recycled plastic*; Product carbon footprint: 4.02 kg CO2e
$12.34
SaleBestseller No. 5
Logitech K270 Full Size Wireless Keyboard for Windows - Black
Logitech K270 Full Size Wireless Keyboard for Windows - Black
Plastic parts in K270 include 38% certified post-consumer recycled plastic; Eight hot keys: For instant access to the Internet, e-mail, music volume and more
$21.48

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.