ScreenshotNeo

BlogUse cases

How to Monitor Indian Government Tender Pages with Scheduled Screenshots

Track official tender listings, corrigenda and status pages with scheduled screenshots, then verify every alert against the current government record.

By the ScreenshotNeo team4 October 202611 min read

To monitor Indian government tender pages with scheduled screenshots, first find the tender on the relevant official portal, save its tender ID and canonical URL, and watch each page that can change the decision: the listing, corrigenda, tender status, and cancellation or retender notices. Schedule a browser capture at a reasonable interval, retain timestamped screenshots, and treat every alert as a prompt to check the current official notice and documents. A screenshot alert is a monitoring aid, not the procurement record or proof of bid compliance.

There is no single page that should be assumed to contain every Indian tender. The National Informatics Centre describes CPPP as a single access point for procurement information across ministries and departments, and says tender enquiries from Central Government ministries and departments, CPSEs, and autonomous and statutory bodies must be published there. NIC also says CPPP fetches real-time tender information from around 100+ integrated organizations; that scope does not establish coverage of every state, local body, or agency. NIC: Government eProcurement System

1. Choose the official source and pages to watch

Start with the authority and geography relevant to your work. Use CPPP for applicable central procurement and identify the official state, Union Territory, department, or organization portal when the tender is published there. The Government of India eProcurement portal offers search and views including active tenders, tenders by closing date, corrigenda, awards, archives, tender status, and cancelled or retendered notices. Its live listing states that latest tender and corrigendum lists update every 15 minutes. Treat this as the portal’s displayed listing-refresh statement, not a guarantee of end-to-end publication or alert timing. Government of India eProcurement System

  1. Search by tender ID when you have one. Otherwise search by organization, location, category or classification, and relevant keywords using the portal’s own filters.
  2. Record the exact tender ID, procuring organization, portal name, closing date and time, and canonical tender URL. Keep the source URL with every capture.
  3. Find the related corrigendum and tender-status views. Also identify cancellation, retender, archive, and closing-date listings if they apply.
  4. Open each URL in a normal browser without being signed in. Confirm the target information actually appears and note any CAPTCHA, login, session requirement, or interaction needed.
  5. Download and retain the tender schedule and published documents from the official portal when needed. Verify amendments against those official documents.

CPPP/NIC’s May 2025 newsletter described GePNIC use across around 800+ central government ministries, departments and public sector units, and 31 state governments/Union Territories. These are dated adoption figures, not a complete inventory of procuring bodies or evidence that every tender is on CPPP. CPPP portal

Page to monitor Why it matters What to verify after an alert
Search results or active tender listing New matching opportunities or changes in listing visibility Open the tender record and confirm the ID and current dates
Tender detail / notice Changes to scope, eligibility, deadlines, or instructions Read the current notice and all attached documents
Corrigendum view Published amendments may affect bid decisions and dates Open each corrigendum and its linked files
Tender status Status can change after the initial notice Confirm the current official status for the tender ID
Cancelled / retendered and archive views Notice may be withdrawn, reissued, or moved to archive Locate the replacement notice or cancellation record

2. Decide what counts as a useful change

Scheduled monitoring has separate pieces: fetching or rendering the page, deciding whether it changed, notifying someone, and showing the change. A screenshot is useful for visual review, but routine page elements can create noisy alerts. Mallawaarachchi et al., “Change Detection and Notification of Webpages: A Survey”

  • High-priority changes: a new corrigendum, revised closing date, changed eligibility wording, cancellation, retender, or status transition.
  • Potential noise: rotating banners, changing timestamps, session notices, page counters, and layout changes unrelated to the tender.
  • Detection choice: whole-page image comparison is easy to understand but can be noisy; a focused element or content comparison can reduce irrelevant changes if your chosen tool supports it.

Do not equate “page changed” with “tender materially changed.” Inspect the changed area and the official record. Keep a manual check for high-priority tenders, especially near closing dates.

3. Build a scheduled screenshot monitor with Python and Playwright

This small self-hosted example uses Chromium to load a public page, take a screenshot, hash the image, and append a change record when the image differs from the previous run. It does not send notifications or interpret tender meaning; it gives you a timestamped visual record and a simple change signal. Use a specific public URL that you are permitted to access.

Install

python -m venv .venv
. .venv/bin/activate
python -m pip install playwright
python -m playwright install chromium

On Windows PowerShell, activate with .venv\Scripts\Activate.ps1. Save the following as monitor.py:

import hashlib
import json
import os
from datetime import datetime, timezone
from pathlib import Path

from playwright.sync_api import sync_playwright

URL = os.environ["TENDER_URL"]
TENDER_ID = os.environ.get("TENDER_ID", "unknown")
OUT = Path(os.environ.get("CAPTURE_DIR", "captures"))
WAIT_MS = int(os.environ.get("WAIT_MS", "1500"))
OUT.mkdir(parents=True, exist_ok=True)

with sync_playwright() as p:
    browser = p.chromium.launch(headless=True)
    page = browser.new_page(viewport={"width": 1440, "height": 1000}, device_scale_factor=1)
    response = page.goto(URL, wait_until="domcontentloaded", timeout=60000)
    page.wait_for_timeout(WAIT_MS)
    stamp = datetime.now(timezone.utc).strftime("%Y%m%dT%H%M%SZ")
    image_path = OUT / f"{TENDER_ID}_{stamp}.png"
    page.screenshot(path=str(image_path), full_page=True)
    browser.close()

image_hash = hashlib.sha256(image_path.read_bytes()).hexdigest()
state_path = OUT / f"{TENDER_ID}_state.json"
previous = json.loads(state_path.read_text()) if state_path.exists() else None
changed = previous is not None and previous["sha256"] != image_hash

record = {
    "checked_at": datetime.now(timezone.utc).isoformat(),
    "tender_id": TENDER_ID,
    "url": URL,
    "http_status": response.status if response else None,
    "screenshot": str(image_path),
    "sha256": image_hash,
    "changed_since_previous_capture": changed,
}
with state_path.open("w") as f:
    json.dump({"sha256": image_hash, "screenshot": str(image_path)}, f, indent=2)
with (OUT / "events.jsonl").open("a") as f:
    f.write(json.dumps(record) + "\n")
print(json.dumps(record, indent=2))

Run it once manually before scheduling so you can inspect the screenshot and ensure it captured the tender content rather than an error page or CAPTCHA:

TENDER_URL='https://eprocure.gov.in/' TENDER_ID='replace-with-tender-id' python monitor.py

Replace the example URL with the exact official tender page you identified. The example does not bypass login, CAPTCHA, or access controls. If the page requires an authenticated session or fails to render in a headless browser, use the portal’s permitted access method and a monitoring service that can legitimately render that page, or check it manually.

Schedule it

On Linux with cron, edit the crontab using crontab -e and add a job such as this, adjusting the absolute paths and interval for your system:

*/30 * * * * cd /path/to/monitor && TENDER_URL='https://eprocure.gov.in/' TENDER_ID='replace-with-tender-id' CAPTURE_DIR='/path/to/monitor/captures' /path/to/monitor/.venv/bin/python /path/to/monitor/monitor.py >> /path/to/monitor/run.log 2>&1

This runs every 30 minutes; it is only an example schedule, not a recommendation or a real-time guarantee. Select a frequency that fits the tender’s importance, your operational needs, and the portal’s terms. Avoid overlapping runs: a slow page load can cause the next scheduled execution to start before the previous one ends. Use a lock or scheduler setting that prevents concurrent jobs if needed.

Options to adapt

  • TENDER_URL: exact page URL to capture; keep one watch per meaningful page or tender view.
  • TENDER_ID: identifier used in screenshot and state filenames. Use a filesystem-safe value.
  • CAPTURE_DIR: persistent storage location. Back it up if the record matters to your workflow.
  • WAIT_MS: extra delay after DOM content loads. Increase only if observed content appears late; a fixed delay does not guarantee every dynamic element has finished loading.
  • viewport and device_scale_factor: set the visible dimensions and pixel scale. Keep these constant between runs or visual hashes will differ.
  • full_page=True: captures the full scrollable page. For a very long listing, consider monitoring a focused page or using a tool that captures a selected element.
  • wait_until: this example uses domcontentloaded. Waiting for networkidle may stall on pages with persistent connections; choose based on the target page behavior.

Exact image hashes mark even tiny visual changes. For fewer false positives, add a reviewed region crop or compare extracted tender text, while retaining the original screenshots. Text extraction can miss layout, image, or document-link changes, so use it as a filter and inspect the source page for decisions.

4. Keep an auditable capture and alert workflow

  1. Store each image with UTC capture time, tender ID, portal name, and source URL. The sample records most of these in its JSONL event file and filename.
  2. When the change flag appears, open the official page directly. Compare the current notice and published documents with the prior capture.
  3. Record what changed and the source document or corrigendum that confirms it. A screenshot can help locate the change but may not show linked PDF content.
  4. Assign a person to review high-priority alerts and maintain a manual check if a missed change would matter.
  5. Periodically confirm the job still runs, screenshots still show the relevant content, storage is available, and the URL has not redirected or changed.

The official eProcurement portal separates corrigenda, status, cancelled or retendered notices, and archives; monitoring only the original tender page can miss important lifecycle changes. Official active corrigendum search

5. Or skip the browser setup

ScreenshotNeo is a website screenshot API and MCP server. A single GET request captures a URL as an image or PDF; for scheduled monitoring, call the endpoint from your scheduler and store each response with the tender ID, source URL, and timestamp. See the ScreenshotNeo API documentation for request options.

curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://eprocure.gov.in/ -o shot.webp
import requests

r = requests.get(
    "https://api.screenshotneo.com/v1/shot",
    params={"access_key": "YOUR_API_KEY", "url": "https://eprocure.gov.in/"},
    timeout=90,
)
open("shot.webp", "wb").write(r.content)
const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://eprocure.gov.in/' });
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);

For an automated schedule, run one of these requests from cron, a task scheduler, or your existing job runner, then compare the returned captures and send your own alert. ScreenshotNeo removes cookie and consent banners, newsletter popups, and chat widgets before capture; each cleanup step can be turned off. Bot checks, CAPTCHAs, blank pages, timeouts, failed loads, and cache hits cost nothing, and response headers identify the page verdict and billing status. Its MCP server provides take_screenshot, get_page_info, and capture_pdf tools for AI agents. The free plan includes 1,000 screenshots a month with no card; paid plans start at $5 for 3,000 screenshots.

Sign up free for 1,000 screenshots a month, with no card.

6. Reliability, performance, and cost

  • Schedule versus freshness: a 30-minute job can take nearly 30 minutes to notice a change, plus load and notification time. The official portal’s displayed 15-minute listing refresh does not make a third-party monitor real time.
  • Load and concurrency: each watched page and run consumes browser time, network traffic, and storage. Capture only relevant pages, stagger jobs, and prevent concurrent runs for the same tender.
  • Transient failures: record HTTP status and capture time, retry temporary failures with a limit and backoff, and keep failed attempts separate from valid screenshots. A blank or challenge page must not overwrite the last known-good capture.
  • Storage: full-page screenshots can grow quickly. Define a retention period, protect access to stored captures, and preserve important files according to your own records policy.
  • Cost: self-hosting avoids an API charge but uses compute, network, maintenance time, and storage. Hosted service cost depends on its current plan and billing rules; verify those before adopting it. ScreenshotNeo’s stated tiers are Free: 1,000/month; 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, and every feature is on every plan.
  • Procurement decisions: do not rely on a screenshot alone for deadlines, eligibility, or compliance. Follow the tender’s official notice, documents, and instructions.

7. Troubleshooting

Symptom Likely cause What to do
Screenshot shows CAPTCHA or bot check The portal challenged automated browsing or the session Do not attempt to bypass it. Check the page manually or use an authorized access route; treat the capture as a failed check, not as a tender change.
Screenshot is blank or incomplete Content loads after initial HTML, a script failed, or the page needs interaction Inspect the page manually, increase the post-load wait cautiously, and confirm the content can be rendered without login or challenge.
Every run is marked changed Dynamic elements, timestamps, rotating content, or different viewport settings alter the image Keep viewport and scale fixed; monitor a focused region or compare relevant text; review the image before acting.
No change is reported after a known amendment The watched URL may be a stale view, the change may be in a linked document, or the job failed Open the official tender and corrigendum pages, verify job logs and capture timestamps, and add the relevant document/listing view to the watch set.
Navigation times out Slow portal response, network issue, or a page that never reaches the selected load condition Check the URL manually, use a suitable load condition, set a bounded timeout, and retry transient failures with backoff.
Scheduled job does not run Wrong absolute paths, missing environment variables, permissions, or cron’s limited environment Use absolute paths, set variables in the job, redirect logs, and run the exact command manually under the same account.
Two jobs overwrite state or produce duplicate alerts Overlapping runs or duplicate schedules Use one schedule per watch and a lock or single-instance scheduler; check whether the previous run is still active.
Screenshot differs after a portal redesign Layout or navigation changed, or the page URL now redirects Reconfirm the canonical official URL and target area, update the watch, and retain the old capture for context.

8. FAQ

Does one monitor cover every Indian government tender?

No. Identify the procuring authority’s official portal and confirm its coverage. CPPP is an important central access point, but the available source claims do not establish that every local or state procurement appears there.

Should I schedule checks every 15 minutes because the portal says its listing updates every 15 minutes?

Not automatically. That is a displayed listing-refresh statement, not a watcher SLA. Choose a schedule based on urgency, operational load, and the portal’s terms, and maintain manual checks for high-priority tenders.

Does a screenshot prove I complied with the tender notice?

No. Use the official current notice, published documents, and portal instructions. A screenshot is a timestamped monitoring aid.

Can I monitor a tender document PDF as well as the webpage?

Yes, if the official source exposes the document to your permitted workflow. Track the document link or download separately; a webpage screenshot does not establish that a linked PDF is unchanged.

Sources: NIC Government eProcurement System; Government of India eProcurement System; CPPP; Mallawaarachchi et al., webpage change-detection survey.