Running gsc-indexer in CI pipelines
· 3 min read
Automate gsc-indexer in CI: cron or GitHub Actions, parseable -json output, non-zero exit codes, and sa.json stored as a secret.

gsc-indexer is built to run unattended: in a cron job, a GitHub Action, or
any pipeline. Two features make that safe: machine-readable output and
predictable exit codes.
-json: parseable output
-json emits a single JSON array of results at the end, with no progress
noise in between (so the output stays valid JSON):
./gsc-indexer -creds sa.json -batch urls.txt -json
Each element carries the full inspection detail:
{
"url": "https://www.toolsura.com/post/",
"inspected_at": "2026-09-04T16:45:12Z",
"indexed": true,
"verdict": "PASS",
"coverage_state": "Submitted and indexed",
"crawled_as": "MOBILE",
"page_fetch_state": "SUCCESSFUL",
"last_crawl_time": "2026-07-18T07:05:51Z",
"google_canonical": "https://www.toolsura.com/post/",
"user_canonical": "https://www.toolsura.com/post/",
"sitemaps": ["https://www.toolsura.com/sitemap.xml"],
"referring_urls": 2,
"referring_urls_list": [
"https://www.toolsura.com/",
"https://www.toolsura.com/blog/"
]
}
Handy fields for automation:
inspected_at— when this check ran; key your time-series data on it.google_canonicalvsuser_canonical— when they differ, Google indexed a different URL than you declared. A silent duplicate-content problem you can now alert on.referring_urls_list— the actual internal links Google reports pointing at the URL, not just the count.
Empty fields are omitted, so NOT INDEXED rows stay short. Pipe the array
into jq or your own script to act on the results. Don't need live JSON on
stdout? -report writes the same per-URL detail to results.json while you
watch the normal terminal output.
Exit codes
- Exit 0: the run finished. This includes URLs that are merely
NOT INDEXED: that's a normal result, not a failure. - Exit non-zero: at least one URL failed (network error, HTTP error, or unparseable response).
This makes the tool CI-friendly: a pipeline step fails only when something genuinely broke, not just because a page isn't indexed yet.
Example: nightly sitemap re-index (cron)
# m h dom mon dow command
30 3 * * * cd /opt/gsc-indexer && ./gsc-indexer -creds /etc/sa.json "https://www.toolsura.com/sitemap.xml" -delay 10s -q -report /var/log/gsc-report >> /var/log/gsc.log 2>&1
Example: GitHub Action
name: reindex
on:
schedule:
- cron: "30 3 * * *"
jobs:
index:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
- run: go build -o gsc-indexer .
- name: Write service account key
run: echo "${{ secrets.GSC_CREDS }}" > sa.json
- run: ./gsc-indexer -creds sa.json "https://www.toolsura.com/sitemap.xml" -delay 10s -q
Store
sa.jsonas a secret (file or env var). Never commit credentials to the repo.
-color: never breaks piped output
Color is auto by default (on for terminals, off when piped). You can force
it with -color always or disable it with -color never. Color is decorative
only: the INDEXED / NOT INDEXED text always carries the meaning.
Next
- Still seeing errors in automation? Troubleshooting.
Sources
- Google Search Console
- URL Inspection API documentation
- Google Search APIs overview
- Service account OAuth (Google Identity)
- About service accounts (Google Cloud IAM)
- Verify site ownership
- Property types: URL-prefix vs Domain
- URL Inspection tool help (request indexing)
- Indexing API (JobPosting/BroadcastEvent only)

Written by
Abhay Khant
Hi, I'm Abhay Thakor
I'm a developer, builder, and technology enthusiast interested in turning ideas into useful products.
I enjoy working across web development, cybersecurity, automation, SEO, and content creation. Rather than only learning technologies individually, I like putting them together to build things that people can use.
One of my main projects is Toolsura, a free online utility platform that brings practical tools into one place. I'm building Toolsura as a product and a learning project where I can explore development, infrastructure, SEO, content distribution, automation, and product growth.
What I Build
My work currently revolves around several areas:
Web development with Next.js, React, Tailwind CSS, and modern web technologies
Backend development with Go, APIs, databases, and server-side systems
Automation using n8n, APIs, Docker, and connected services
SEO and content systems for building organic search traffic
Cybersecurity including web security, bug bounty, SOC concepts, and malware analysis
Content creation including video editing, YouTube content, graphics, and promotional videos
I enjoy going beyond tutorials and experimenting with complete systems, from the frontend interface all the way to the backend, deployment, automation, and distribution.
Toolsura
Toolsura is one of the projects I'm most actively building.
The idea is simple: create useful, accessible online tools that solve small problems quickly.
Toolsura includes utilities for things such as text, JSON, URLs, PDFs, images, security checks, and other everyday technical tasks.
Building it has also become a practical way for me to learn how a modern web product works.
That means working on:
Product → Development → Infrastructure → SEO → Content → Distribution → Automation → Growth
Technology & Learning
I'm particularly interested in understanding how systems work rather than simply learning how to use them.
My development work has included technologies such as:
Next.js · React · TypeScript · Tailwind CSS · Go · Gin · GORM · PostgreSQL · MongoDB · Docker · RabbitMQ · MinIO · Strapi
I've also worked with Linux environments and tools such as Kali Linux, Termux, and related security tooling.
My cybersecurity interests include web application security, bug bounty research, SOC analysis, and malware analysis.
Building in Public
I also create content around the things I build and learn.
This includes:
Tutorials and technical articles
YouTube videos
Product demonstrations
Visual explainers
Promotional videos
SEO-focused educational content
My goal is to turn projects and experiments into useful resources that other people can learn from.
Why I Build
For me, building is one of the best ways to learn.
Instead of learning a technology in isolation, I prefer starting with a real problem and figuring out what is required to solve it.
Sometimes that means writing code. Other times it's debugging a deployment at midnight, or working out why a page isn't being indexed, why an API isn't behaving correctly, or how to automate something that would otherwise take hours.
Those problems are part of the process.
Every project gives me another opportunity to understand how technology works in the real world.
What I'm Working Toward
I'm continuing to develop my skills across software engineering, cybersecurity, automation, and digital products.
At the same time, I'm building Toolsura into a useful platform and experimenting with different ways to create, distribute, and grow technical products.
There is still a lot to learn, but that's exactly what makes building interesting.
Let's Connect
If you're interested in web development, cybersecurity, automation, SEO, online tools, or building products, feel free to connect.
I'm always interested in learning, experimenting, and building something useful.
Build. Learn. Improve. Repeat.