Tool · tool guide

Batch SEO URL Check: Run a Bounded Live Public Audit

Run a batch SEO URL check from a reviewed URL file, cap concurrency, retain one JSON artifact per page, aggregate every failure, and return a truthful exit.

Published Updated 10 min readBy William Zhu & InfiniSynapse Data Team

Author credentials: William Zhu is cofounder of InfiniSynapse (GitHub @allwefantasy · auto-coder). Desk: shipping SEO Health and the /en/tool/ visibility pages. No personal LinkedIn published. About: team / editorial standards.

Publisher credentials: InfiniSynapse has public profiles on GitHub, YouTube, and X. A 2026 WAIC Future Tech OPC excellence award covers the Agentic Data Infra entry (WAIC; third-party recap: Xinhua / Caohejing). That award does not review this page or SEO Health. Method CLI: infinitegrowth on npm. Archive: recognition and scope notes.

Batch SEO URL Check: Run a Bounded Live Public Audit
On this page

By William Zhu · Cofounder, InfiniSynapse · Published: 2026-09-09 · Last updated: 2026-09-14 · Last verified: 2026-09-14 · Reviewed by the InfiniSynapse Data Team.

Reviewed by: InfiniSynapse Data Team · method review 2026-09-14. Six sequential first-party CLI documents plus local gate.mjs fixture exits.

Trust / COI: About · Corrections. SEO Health is a commercial product from this team. The six-URL table is this host, not a customer crawl and not a sitemap sample.

TL;DR

batch SEO URL check work on 2026-09-14 was six sequential first-party fetches, not a sitemap crawl. Every process exited 0. Every document still carried one Image Alt Text warning. A loop that ORs only process exits would have gone green.

Direct answer: Treat a batch SEO URL check as one retained JSON file per reviewed URL plus one aggregator that reads issues[].status. On 2026-09-14 six tool URLs all left exit 0 beside a warning. Process 0 on every line is not a batch pass.

The sample size is six sequential first-party checks. That sample cannot establish how a 500-URL list would behave, and it does not prove a ranking outcome. A batch SEO URL check record that drops per-URL filenames is no longer replayable.

What you will learn

  • Which six first-party URLs the desk actually fetched
  • Why every CLI exit was 0 while every warning count was 1
  • How a shell loop that only inspects $? lies
  • What gate.mjs does to one file before you aggregate
  • Where this batch SEO URL check page stops and a clock job begins

What a batch SEO URL check actually retains

Key definition: A batch SEO URL check is a bounded loop over a reviewed URL file that keeps one JSON document per line and returns nonzero when any line is a contract failure or a policy red. It does not certify rankings. It does not invent a sitemap. Its useful output is a directory of files plus a truthful aggregate exit.

The GNU Bash manual is the platform reminder that a while read loop sees each line's exit separately unless you collect them. That manual does not grade this host.

People open a batch SEO URL check when they already have a short reviewed list and need one artifact per URL. They do not need a 50-page crawl on the first day. They need a filename, a version, and a parser that survives a green transport.

WHATWG URL Standard is why the loop should reject a line that is not an HTTPS URL before it spends a fetch. Validation is not a keep vote. It is how a batch SEO URL check avoids becoming an open relay.

After each URL has a retained file, a team may enqueue named rows on an InfiniSynapse Server API long-task workspace and follow SSE. That API path does not collapse six files into one unofficial score.

One line, one filename

Hash the URL or slug it. Write reports/$key.json. If the command cannot reach the host, write a failure row and keep going. Do not overwrite the previous file with an empty object.

curl exit codes are a second independent map of transport failure. A DNS miss is not a page-level error row. Classify it as command failure.

Reviewed input, not discovery

A batch SEO URL check starts from urls.txt, not from a sitemap walk. If the job is a clock plus a page cap, that is a different page. Keep the input of record in the repository so another engineer can replay the same six lines.

Six sequential documents on 2026-09-14

Node v22.18.0 was on PATH. The package pin was infinitegrowth@0.1.1. The desk called the pinned CLI once per slug, in sequence, with cached=false on every document.

slugtitle_lendesc_lenwordsspeedttfbhtmlblockingScriptsCLI exitwarnings
seo-ci-cd491533332721488 ms100.9 KB101
github-actions-seo-audit471543276721274 ms101.3 KB101
infinitegrowth-npm461563250721195 ms100.9 KB101
json-seo-report411583319721144 ms101.5 KB101
batch-seo-url-check401563362721241 ms100.2 KB101
cursor-seo-skill451523409721192 ms102.8 KB101

Every warning row was Image Alt Text (2/5 images). Top-level keys on every document were url, page, onPage, issues, images, keywords, speed, seoData, and cached. issues[].status values seen were good and warning. No error row appeared in this sample.

A batch SEO URL check that ORs six zeros still reports success. The warning rows would disappear. That is the failure this page exists to name.

Grouped bars for six sequential first-party checks: process exit beside warning-row count

Figure: Two series from the same desk. Process exit is not warning-row count. Neither series is a ranking score.

Same keys, six files

Do not merge the six documents into one unofficial average. Speed sat at 72 on every row. TTFB ranged from 1144 ms to 1488 ms. Those numbers stay attached to their URLs. A batch SEO URL check that flattens them into one score has already laundered the evidence.

RFC 9110 HTTP semantics is why a 200 on six URLs still is not a keep decision. Status is fetch. Policy is the parser.

This slug's own document

The live document for /en/tool/batch-seo-url-check used title length 40, word count 3362, TTFB 1241 ms, and HTML 100.2 KB. CLI exit was 0. The warning was still present. Re-run the command after a deploy. A later HTML change can move Image Alt Text without changing process status. That is why a batch SEO URL check stores the document, not only the exit code.

How to reproduce the six-URL loop

Save the six HTTPS lines in a reviewed file. Run them in sequence. Keep every stdout.

mkdir -p reports
for u in \
  seo-ci-cd github-actions-seo-audit infinitegrowth-npm \
  json-seo-report batch-seo-url-check cursor-seo-skill
do
  npx --yes -p infinitegrowth@0.1.1 seo-health check \
    --format json --lang en \
    "https://infinisynapse.com/en/tool/$u" \
    > "reports/$u.json"
  echo "$u exit:$?"
done

As of 2026-09-14 each line printed exit:0. A batch SEO URL check that stops there is unfinished. Parse each file. Count warning and error rows. Return nonzero when policy says so.

Node.js file-system API is why you write each document to disk before you parse it. A pipe that only keeps the last stdout is how five URLs vanish.

The first loop line without -p returned exit 1 and stderr error: unknown command 'seo-health' before any of the six URLs were requested. Pin with -p.

How to reproduce one fixture

Before you trust the loop, run the same local gate the desk used.

node gate.mjs red.fixture.json; echo exit:$?
node gate.mjs malformed.fixture.json; echo exit:$?
# SEO_CONTRACT missing_result_arrays · exit 2

A batch SEO URL check should call that gate once per retained file. If any call returns 2, the aggregate is already red. If any call returns 1, the aggregate is already red. Six zeros from the CLI do not override those numbers.

Node.js process API is why the aggregate exit is visible to a required check. Document the mapping. Do not collapse 1 and 2.

Why an OR of exits is the wrong aggregator

Transport success only proves that a process returned data. It does not prove the page passed the checks inside that data. For a batch SEO URL check, six transport successes plus six warning rows is the observed pattern.

OWASP SSRF prevention is why the loop must not accept an unreviewed line that points at an internal host. Input review is a security control. It is not a ranking claim.

Missing file is exit 2

If reports/$key.json is absent, do not skip the line as a warning. Disk, network, and parse failures need their own nonzero code. The desk used 2 for contract failures.

Warning-only JSON is still a row

The live sample had no error status. It had one warning per URL. Your policy may keep warning as exit 0. That choice must be written down. A batch SEO URL check that hides the warning count is already late.

Where this page stops

This page owns the sequential six-URL desk and the aggregator rule. Surfaces that fail differently live on siblings. A batch SEO URL check write-up does not become a cron walkthrough on this URL.

A clock plus a page cap is a different trigger. A schema walkthrough is a different layer. Record the command, the package version, the UTC date, each target URL, the original fields, and the actual exit code per file.

Keep stdout on disk even when the parser later returns 1. A red check without a file creates an argument. A retained file creates a repair queue. Never hand-edit a report between generation and parsing.

The SEO CI/CD complete guide owns the shared decision model. Open that hub when the question is the merge rule rather than the URL file. A batch SEO URL check only answers how many reviewed lines you kept and how you aggregated them.

Adoption in four reviewable commits

Do not land the URL file, the loop, the parser, and branch protection in one opaque commit. A batch SEO URL check is easier to revert when each change leaves a file. Reproduce the six-URL loop on a throwaway branch before anyone calls the aggregate a release gate.

Commit three reviewed URLs

Start with three public, non-sensitive lines. Reject anything that is not HTTPS. Do not start with 500 pages.

Prove the negative fixture

Run gate.mjs on red and malformed fixtures. Record exits 1 and 2. Then feed a warning-only live file and record whether policy treats it as 0.

Connect the six-URL loop

Run the sequential command above. Archive all six JSON files. Compare issues[].status across rows. A batch SEO URL check rollout that only screenshots the last echo is hiding five files.

Require the aggregate check

A job that fails but is not required is telemetry. Configure the named job so a nonempty failures.tsv blocks merge. Keep every per-URL artifact on failure.

Failure modes worth a per-URL file

OR of process exits. Six zeros hide six warnings. Parse each document.

Last-file-wins. Redirecting every URL onto the same path deletes evidence. A batch SEO URL check needs unique filenames.

Unreviewed input. An open urls.txt that anyone can append becomes an SSRF footgun. Review the file in the same pull request as the loop.

Wrong argv in the loop. Forgetting -p fails the first line with unknown command 'seo-health'. Put the working form in the runbook.

Missing artifact treated as skip. If one URL fails to write JSON, the aggregate must go red. Do not invent an empty green object.

Cluster guides

Use this page for the sequential list, then open the surface you actually operate.

Job you actually haveGuide to open next
Shared merge rule: file, fields, exitSEO CI/CD
Schema and JSON.parse before policyJSON SEO report
A clock-triggered sample with a page capscheduled site audit

Inspect one URL before you loop the list

Run the browser form once, then reproduce the same JSON from the pinned CLI and keep one file per line.

Run SEO Health Checker

Use a public URL and never paste secrets.

Frequently Asked Questions

Does the bounded loop require a login?

No. Default check, audit, and links do not need a CLI key. eeat, aivisibility, and gsc do. Keep those deep commands out of the default batch SEO URL check job unless a named owner accepts the spend.

What should one malformed report do to the rest of the list?

Fail the aggregate. Keep the other files. The desk used exit 2 for a missing issues array. Malformed data is not a warning, because a batch SEO URL check cannot prove that line's checks ran.

Can the aggregate trust process exits alone?

No. All six live documents exited 0 while Image Alt Text was warning. Parse issues[] and onPage[]. Preserve name and status. Then apply the repository rule.

Does the loop calculate an official Google score?

No. A batch SEO URL check stores traffic-light rows as local policy. Those rows are not a Google grade, an index promise, or a traffic forecast.

Do we claim a hosted runner passed?

No. This rewrite executed a local fixture set and six public CLI calls from a desk. A required check on GitHub or GitLab is a later commit. Do not display a badge we did not earn.

Conclusion

Use a batch SEO URL check when the job is to keep one JSON file per reviewed URL and return a truthful aggregate. The 2026-09-14 desk shows six exits of 0 beside six warning rows. Close the batch SEO URL check file when each filename, the version, the raw fields, and the parser exit are still visible. A bounded list is more useful than an unsupported crawl claim.

Open the InfiniSynapse web app only when a signed-in deep command is budgeted. The loop still ends at six files and one aggregate exit.

WZ

William Zhu · Cofounder, InfiniSynapse · GitHub @allwefantasy

Desk-validated SEO Health methods. Corrections: zhuhl@infinisynapse.com · corrections policy.

Batch SEO URL Check: Run a Bounded Live Public Audit