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.
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.

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.mjsfixture 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.mjsdoes 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.
| slug | title_len | desc_len | words | speed | ttfb | html | blockingScripts | CLI exit | warnings |
|---|---|---|---|---|---|---|---|---|---|
| seo-ci-cd | 49 | 153 | 3332 | 72 | 1488 ms | 100.9 KB | 1 | 0 | 1 |
| github-actions-seo-audit | 47 | 154 | 3276 | 72 | 1274 ms | 101.3 KB | 1 | 0 | 1 |
| infinitegrowth-npm | 46 | 156 | 3250 | 72 | 1195 ms | 100.9 KB | 1 | 0 | 1 |
| json-seo-report | 41 | 158 | 3319 | 72 | 1144 ms | 101.5 KB | 1 | 0 | 1 |
| batch-seo-url-check | 40 | 156 | 3362 | 72 | 1241 ms | 100.2 KB | 1 | 0 | 1 |
| cursor-seo-skill | 45 | 152 | 3409 | 72 | 1192 ms | 102.8 KB | 1 | 0 | 1 |
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.
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 have | Guide to open next |
|---|---|
| Shared merge rule: file, fields, exit | SEO CI/CD |
Schema and JSON.parse before policy | JSON SEO report |
| A clock-triggered sample with a page cap | scheduled 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 CheckerFrequently 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.
William Zhu · Cofounder, InfiniSynapse · GitHub @allwefantasy
Desk-validated SEO Health methods. Corrections: zhuhl@infinisynapse.com · corrections policy.