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

iTechGuides is reader-supported. When you buy through links on our site, we may earn an affiliate commission. As an Amazon Associate I earn from qualifying purchases. Learn more

You can capture screenshots from a CSV with PagePeeker by having a script read each row and make a separate request to PagePeeker’s V2 thumbnail API. The reviewed API documentation describes per-URL requests, not a native CSV importer or bulk-capture endpoint, so this is a client-side loop rather than a built-in batch feature.

What you need before starting

  • A CSV file with a clearly named column containing absolute page URLs, such as url.
  • Python 3 and permission to make outbound HTTP requests from the machine running the script.
  • A PagePeeker account code if your account requires one or you want the request associated with your account. Keep it in a local script or server-side environment; do not publish it in a webpage, where others could use your quota.

Check your account’s current terms, quota and plan before a large run. The API documentation and pricing can change, and the pricing figures in this guide are a snapshot accessed on October 3, 2026.

How the PagePeeker CSV workflow works

  1. Read the CSV one row at a time and extract its URL.
  2. URL-encode the page URL as a query parameter.
  3. Request a PagePeeker V2 thumbnail for that URL.
  4. Check the response and save the image under a distinct filename.
  5. Record failures so you can retry only the affected rows.

PagePeeker documents this V2 request pattern: http://{entrypoint}.pagepeeker.com/v2/thumbs.php?size={size}&code={code}&refresh={refresh}&wait={wait}&url={url}. The documented entrypoints are free and api. The URL parameter must be encoded; building a query string with a library avoids errors when a page URL contains characters such as & or ?.

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

Choose a thumbnail size

The standard V2 sizes listed by PagePeeker are thumbnails, not full-page dimensions. Pick the smallest size that works for your report, catalog or review workflow; larger images take more storage to save and process.

Size code Documented dimensions
t 90 × 68 pixels
s 120 × 90 pixels
m 200 × 150 pixels
l 400 × 300 pixels
x 480 × 360 pixels

PagePeeker says additional sizes may be available on premium accounts. Its separate full-page capture offering is described as a premium feature and includes options such as custom page width and maximum height, compression, thumbnail renditions, overlay text and wait settings. Check the current full-page capture information if you need content below the fold rather than a thumbnail.

Runnable Python script for a CSV

This script reads a column named url, requests one thumbnail per valid row, and writes each result to an output folder. It uses Python’s standard library, validates that responses look like images, and logs the original row number and outcome to results.csv. Set the entrypoint and size to values appropriate for your account. If your account uses a code, set the PAGEPEEKER_CODE environment variable rather than putting the code in a public page.

import csv
import os
import time
from pathlib import Path
from urllib.error import HTTPError, URLError
from urllib.parse import urlencode
from urllib.request import Request, urlopen

INPUT_CSV = Path("urls.csv")
OUTPUT_DIR = Path("screenshots")
RESULTS_CSV = Path("results.csv")
ENTRYPOINT = "free"  # PagePeeker documents "free" and "api" entrypoints.
SIZE = "x"           # t, s, m, l, or x in the standard documented set.
CODE = os.getenv("PAGEPEEKER_CODE", "")
TIMEOUT_SECONDS = 60
PAUSE_SECONDS = 0.5   # Conservative pacing; no official rate limit is stated here.

OUTPUT_DIR.mkdir(parents=True, exist_ok=True)

with INPUT_CSV.open("r", newline="", encoding="utf-8-sig") as source, 
     RESULTS_CSV.open("w", newline="", encoding="utf-8") as results:
    reader = csv.DictReader(source)
    if not reader.fieldnames or "url" not in reader.fieldnames:
        raise SystemExit("CSV must include a column named 'url'.")

    writer = csv.DictWriter(results, fieldnames=["row", "url", "status", "file", "detail"])
    writer.writeheader()

    for row_number, row in enumerate(reader, start=2):
        page_url = (row.get("url") or "").strip()
        if not page_url.startswith(("http://", "https://")):
            writer.writerow({"row": row_number, "url": page_url, "status": "skipped", "file": "", "detail": "Expected an absolute http:// or https:// URL"})
            continue

        params = {"size": SIZE, "url": page_url}
        if CODE:
            params["code"] = CODE
        request_url = f"http://{ENTRYPOINT}.pagepeeker.com/v2/thumbs.php?{urlencode(params)}"
        output_file = OUTPUT_DIR / f"capture-row-{row_number:05}.img"

        try:
            request = Request(request_url, headers={"User-Agent": "CSV-PagePeeker-Capture/1.0"})
            with urlopen(request, timeout=TIMEOUT_SECONDS) as response:
                content_type = response.headers.get("Content-Type", "").lower()
                body = response.read()
                if response.status != 200:
                    raise RuntimeError(f"HTTP status {response.status}")
                if not content_type.startswith("image/"):
                    raise RuntimeError(f"Expected an image response, received Content-Type {content_type or '(missing)'}")
                output_file.write_bytes(body)
            writer.writerow({"row": row_number, "url": page_url, "status": "saved", "file": str(output_file), "detail": ""})
        except (HTTPError, URLError, TimeoutError, RuntimeError, OSError) as error:
            writer.writerow({"row": row_number, "url": page_url, "status": "error", "file": "", "detail": str(error)})

        results.flush()
        time.sleep(PAUSE_SECONDS)

print(f"Finished. See {OUTPUT_DIR} and {RESULTS_CSV}.")

Run it from the directory containing urls.csv:

python capture_csv.py

The script uses a generic .img suffix because the documented API information cited here does not establish a fixed response image format. If you need a particular output format or extension, verify the current PagePeeker response behavior and account options first. The script also deliberately handles non-image responses as errors instead of saving an error page under an image filename.

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.
Rank #2
Free Fling File Transfer Software for Windows [PC Download]
  • Intuitive interface of a conventional FTP client
  • Easy and Reliable FTP Site Maintenance.
  • FTP Automation and Synchronization

Account codes, readiness, and usage accounting

PagePeeker’s documentation makes the code parameter optional and recommends it for server-side calls. If supplied in a public client-side page, it could let other people consume your account quota. Keep it in a local environment variable or server-side configuration.

A response may not mean a final thumbnail is already ready. PagePeeker documents a readiness API and a premium wait option. For workflows that need to distinguish pending captures from completed images, consult the V2 API documentation and use its readiness mechanism rather than treating every response body as a completed screenshot.

PagePeeker’s FAQ says a displayed cached thumbnail, an uncached thumbnail generation, a readiness check, and any exposed API call each add one API call. Unused monthly quota does not roll over. Estimate the work accordingly: a single row can use more than one API call if you make a readiness request or repeat a request, and retries can add calls too.

Plan for large CSV runs

The V2 API documents individual URL requests, but the reviewed official pages do not document a CSV upload, native batch endpoint, maximum batch size or request-rate limit. Do not assume that a large number of requests can be sent at once. Use modest sequential pacing or bounded concurrency, preserve per-row outcomes, and check your account’s current terms or contact PagePeeker before a very large job.

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

When accessed on October 3, 2026, PagePeeker’s pricing page listed Basic at $5.99 per month for 100,000 API calls and Advanced at $39.99 per month for 1,000,000 API calls. These are volatile plan details, not a guarantee that the prices or quotas remain unchanged; confirm the current pricing before committing to a run. The FAQ’s accounting rule matters when forecasting: it counts readiness checks as well as thumbnail-related calls.

Troubleshooting common failures

  • The script rejects every row: Confirm the CSV header is exactly url and that each value is an absolute URL beginning with http:// or https://. The example uses UTF-8 with BOM support for common spreadsheet exports.
  • Request fails for URLs with query strings: Do not append a raw page URL to the endpoint. The script uses urlencode so embedded query delimiters are escaped.
  • Saved output is not an image: The API may return an error or a not-ready response. Check the content type, consult the documented readiness endpoint or premium wait option, and log the row for a later retry instead of treating the body as an image.
  • Requests time out: A slow or unreachable target can exceed the timeout. Retry failed rows separately with a suitable timeout and keep the retry count bounded so one bad URL does not stall the entire CSV.
  • Quota is lower than expected: Include readiness checks, retries and other exposed API calls in the estimate. PagePeeker says cached and newly generated thumbnail accesses each count as calls, and unused monthly quota does not carry forward.
  • Unexpectedly high request volume: The official pages reviewed do not establish a maximum batch size or rate limit. Reduce concurrency, add pacing, and confirm account guidance before scaling further.
  • Images are too small or omit below-the-fold content: Standard thumbnails top out at 480 × 360 pixels in the documented size list. Check whether your premium account offers additional sizes or full-page capture if the output needs more detail or page depth.

When a local tool may fit better

If you do not specifically need PagePeeker’s hosted thumbnail API, shot-scraper documents a local multi workflow driven by a YAML list of URLs and output filenames. That is a different workflow, requiring local tool setup; the reviewed source establishes the YAML multi-shot feature, not a complete cost or feature comparison. Choose based on whether you need hosted capture or local browser control, the interactions and authentication required, output dimensions and formats, storage destination, and quota model.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Or skip the browser setup

For a direct screenshot API call with ScreenshotNeo, create an API key and request a URL. See the ScreenshotNeo API documentation for parameters and response details.

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

ScreenshotNeo removes cookie banners, newsletter popups and chat widgets before capture; bot checks, blank pages and failed loads are never billed. Its MCP server lets AI agents take screenshots, and the free plan includes 1,000 screenshots per month with no card; paid plans start at $5 for 3,000. Learn more at ScreenshotNeo. Sign up free for 1,000 screenshots a month, with no card.

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

Site owners: PagePeeker’s published robot rule

PagePeeker says its robot attempts to capture a site or page when a client requests it and tries to fetch a page only once every 5–7 days. That is PagePeeker’s stated behavior, not a guarantee for each URL or a rule for other services. Site owners who want to block its robot can place this rule in robots.txt:

User-agent: PagePeeker
Disallow: /

See PagePeeker’s robot information for its published guidance.

Frequently Asked Questions

Does PagePeeker provide an official CSV uploader?

The reviewed V2 API documentation describes per-URL requests; it does not document a CSV importer or batch endpoint.

Can this workflow capture full pages?

PagePeeker describes full-page capture as a premium offering; the standard V2 size list is for thumbnails.

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

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.