Advanced/Cloud Health Check

Cloud Health Check

Know when a site change breaks a template, before your next run. Checks run in the cloud, so your browser can stay closed.

What a health check does

A check opens the template's page, tries every field, and reports how each one did.

  • Each field is marked working or broken, with the value it found.
  • The result is kept as history, so you can see when a field first broke.
  • Broken fields can be repaired automatically or after your review (see below).

Checks count against your plan's monthly cloud health checks. See Plans & Credits.

Run a check and schedule checks

Both are done from your templates list in the web console.

1

Check now

Open Dashboard → Templates, pick a template, and click Check now. The result lists every field with its status and current value.

Template health result

Replace with actual extension screenshot

A health check result
2

Schedule it

Turn on the schedule for a template to check it automatically. The default is once a day, at 08:00 in your device's time. You can change how often it runs.

Template schedule

Replace with actual extension screenshot

Schedule a cloud health check

Auto-repair

When a check finds broken fields, ScraperQ can propose new selectors and apply them.

  • Manual repair (default): repairs wait for your review. You see the old and new values and accept or reject them.
  • Auto repair: confident repairs are applied for you, and you get an email summary of what changed.

Templates built without AI

Repair is not guaranteed for templates built without AI. They are less stable, so a check may find a problem that cannot be fixed automatically.

REST API

Run health checks from your own scripts, CI, or monitoring.

1

Create an API key

Open Dashboard → API keys, create a key, and copy it. The key is shown once, so store it somewhere safe. Revoke a key at any time from the same page.

2

Send it in the X-Api-Key header

The base address is https://api.scraperq.com/api/v1. The template's ID is the last part of its page address in the console.

Run a check and wait for the result

GET /cloud/health-checks/templates/{templateId}/check-now starts a check and returns the full summary when it finishes. Options: timeoutSeconds (5 to 300, default 180; the response says so if it timed out), runAutoRepair (true or false) and approvalMode (auto or manual).

curl "https://api.scraperq.com/api/v1/cloud/health-checks/templates/<TEMPLATE_ID>/check-now?timeoutSeconds=180" \
  -H "X-Api-Key: <YOUR_API_KEY>"

Start a check without waiting

POST /cloud/health-checks/templates/{templateId}/probe-now queues a check and returns at once. Use a webhook to learn the result.

curl -X POST "https://api.scraperq.com/api/v1/cloud/health-checks/templates/<TEMPLATE_ID>/probe-now" \
  -H "X-Api-Key: <YOUR_API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{ "runAutoRepair": true, "approvalMode": "Manual" }'

Webhooks

ScraperQ calls your URL when something happens, so you do not have to poll.

Add a webhook under Dashboard → Channels: give it your URL and pick the events you want. Use the test button to send a sample.

EventSent when
JobCompletedA cloud job finishes successfully.
JobFailedA cloud job fails or is cancelled.
BatchReceivedA batch of scraped rows arrives.
HealthDegradedA health check finds that a template's fields have degraded.

What you receive

Each delivery is a POST with these headers: X-ScraperQ-Event (the event name), X-ScraperQ-Delivery (a unique ID) and X-ScraperQ-Signature.

Verify the signature

The signature is sha256= followed by the HMAC-SHA256 of the raw request body, using your webhook's secret, in lowercase hex. Reject requests that do not match.

import { createHmac, timingSafeEqual } from "node:crypto";

// rawBody: the request body exactly as received (a string); secret: your webhook's secret
function isFromScraperQ(rawBody, signatureHeader, secret) {
  const expected = "sha256=" + createHmac("sha256", secret).update(rawBody).digest("hex");
  const a = Buffer.from(expected);
  const b = Buffer.from(signatureHeader ?? "");
  return a.length === b.length && timingSafeEqual(a, b);
}

Missed a delivery?

Each webhook keeps a list of its deliveries, and you can resend one from there.