Watch for pages dropping out of Google's index with the URL Inspection API

Every weekday the agent inspects your sitemap URLs through Search Console and asks you to act when a page that was indexed no longer is, with Google's reason.

Runs
Weekdays at 7:00
Posts
Asks you

From your apps to your board

How the skill works: your agent reads urls that matter from Google Search Console; search console property from What you tell it, weekdays at 7:00, and gives you a question for you and a telegram ping and the report in the chat.

Reads

  • Google Search ConsoleURLs that matter
  • What you tell itSearch Console property
reads
Your agentClaude Code, Codex, Cursor or GeminiWeekdays at 7:00
posts

You get

  • A question for youOn your board, answered with a tap
  • A Telegram pingOnly when it needs your answer, if you connect Telegram
  • The report in the chatEvery run, with or without Briefkin

What you get

  • URLs inspected and how many changed since the last run.
  • Newly not indexed: each URL with Google's coverage state, the field behind it and the last crawl date.
  • Canonical changes: pages where Google chose a canonical other than yours.
  • The ask: who should fix what, split into code causes and content causes.

The card on the right is a sample. Yours shows your own numbers and updates in place every run.

What lands on your board

example.comSearch Console indexing issues · Claude Code

5 pages dropped out of Google's index

Three of these need a code fix: /pricing/teams carries a noindex tag, /docs/api/webhooks is blocked by robots.txt and /integrations/xero returns 5xx. Should I draft a ticket for the developers?

Inspected 640 sitemap URLs. 5 pages that were indexed last week are not now, and 3 of the causes are in code: a noindex tag, a robots.txt rule and server errors.

URLCoverage stateLast crawl
/pricing/teamsExcluded by ‘noindex’ tagOct 14
/docs/api/webhooksBlocked by robots.txtOct 13
/integrations/xeroServer error (5xx)Oct 15
/blog/invoice-vs-billDuplicate, Google chose different canonical than userOct 12
/templates/packing-slipSoft 404Oct 14
Resolve
An example with made-up numbers. Your agent posts your real ones.

What it does

Pages fall out of Google's index for reasons that start in code: a noindex left on after staging, a robots.txt rule that matched more than intended, a template that now returns a soft 404. The Page indexing report shows it eventually, as a count that crept up, with no alert and no date.

The agent inspects your important URLs one by one, remembers each verdict, and asks only when a page goes from indexed to not. Developers get the exact URL and Google's reason; the SEO lead hears about it before the traffic does.

How it works

  1. 1Collect the URLs that matter

    List the property's sitemaps with sitemaps.list, fetch each file and gather its <loc> URLs. Add the top 200 pages by clicks from searchanalytics.query (dimension page, last 28 days) in case some are missing from the sitemap.

  2. 2Inspect each URL

    Call urlInspection.index.inspect with inspectionUrl and siteUrl. From indexStatusResult, keep verdict, coverageState, indexingState, robotsTxtState, pageFetchState, googleCanonical, userCanonical and lastCrawlTime.

  3. 3

    3Stay inside the quota

    The API allows 2,000 inspections per property per day and 600 per minute. On larger sites, inspect the top pages every day and rotate through the rest of the sitemap over the week.

  4. 4

    4Compare with the last verdict

    Keep each URL's result between runs. A page is newly not indexed when its verdict was PASS last time and is now NEUTRAL or FAIL, or when googleCanonical no longer matches userCanonical.

  5. 5

    5Ask, with the cause

    Group dropped pages by cause (BLOCKED_BY_META_TAG, robots.txt DISALLOWED, SOFT_404, SERVER_ERROR, a canonical mismatch) and post one action card. Causes in code go to developers; "Crawled - currently not indexed" is a content question.

  6. Post it to the board

    With BRIEFKIN_TOKEN set, the agent sends the result as one card that updates in place every run. Without it, you get the report in the chat.

Install and run it

Pick your agent, where the data comes from and how to schedule it; the commands below follow.

Agent
Data
Schedule
  1. Install the skill

    One command. It puts the SKILL.md in ~/.claude/skills and in ~/.agents/skills, which Codex, Cursor, Gemini CLI, Copilot CLI and OpenCode read too.

    shellcurl -fsSL https://briefkin.dev/skills/google-search-console-indexing-issues/install | sh
  2. Run it

    Ask Claude Code:

    promptRun the google-search-console-indexing-issues skill

    Or paste the prompt instead of installing:

    promptCheck Google's index status for my site with the Search Console URL Inspection API. Read my sitemaps (sitemaps.list, then each sitemap's <loc> URLs) plus my top 200 pages by clicks from the last 28 days. Inspect each URL with urlInspection.index.inspect, staying under 2,000 a day, and record verdict, coverageState, indexingState, robotsTxtState, pageFetchState, googleCanonical, userCanonical and lastCrawlTime. Compare with the previous results I give you, and list pages that went from PASS to not indexed or whose Google canonical differs from mine. Group them by cause, say which need a code fix and which are content issues, and ask me who should handle them.
  3. Put it on a schedule

    Weekdays at 7:00, from cron on any machine where Claude Code is signed in:

    crontab0 7 * * 1-5 claude -p "Run the google-search-console-indexing-issues skill"

    Add it with crontab -e. A laptop asleep at that time runs it when it wakes if you use launchd or Task Scheduler instead; GitHub Actions works for the API route.

  4. Send it to your board

    Connect Briefkin once with curl -fsSL https://briefkin.dev/install | sh and every run lands on your board as a question for you. How setup works

View the SKILL.mdRaw file
SKILL.md---
name: google-search-console-indexing-issues
description: "Every weekday the agent inspects your sitemap URLs through Search Console and asks you to act when a page that was indexed no longer is, with Google's reason. Use when the user asks for this, or when it runs on a schedule."
---

# Search Console indexing issues

Every weekday the agent inspects your sitemap URLs through Search Console and asks you to act when a page that was indexed no longer is, with Google's reason.

Pages fall out of Google's index for reasons that start in code: a `noindex` left on after staging, a robots.txt rule that matched more than intended, a template that now returns a soft 404. The Page indexing report shows it eventually, as a count that crept up, with no alert and no date.

The agent inspects your important URLs one by one, remembers each verdict, and asks only when a page goes from indexed to not. Developers get the exact URL and Google's reason; the SEO lead hears about it before the traffic does.

## Two ways to get the data

Use the API or MCP route when you have an MCP server, a CLI or an API token for the app. Otherwise, if you can drive a browser the user is signed in to (Claude in Chrome, a Playwright or Chrome DevTools MCP server), use the browser route. Say which one you used.

## Route A: API or MCP server

### What you need

- Full or restricted user access to the Search Console property; URL inspection only works on properties you are a user of.
- Search Console API access through an MCP server, a connector, or `webmasters.readonly` credentials, and a place to keep the last run's verdicts (a JSON file next to the skill is enough).

If something is missing, say what and stop; do not invent numbers.

### Steps

1. **Collect the URLs that matter** (Google Search Console): List the property's sitemaps with `sitemaps.list`, fetch each file and gather its `<loc>` URLs. Add the top 200 pages by clicks from `searchanalytics.query` (dimension `page`, last 28 days) in case some are missing from the sitemap.
2. **Inspect each URL** (Google Search Console): Call `urlInspection.index.inspect` with `inspectionUrl` and `siteUrl`. From `indexStatusResult`, keep `verdict`, `coverageState`, `indexingState`, `robotsTxtState`, `pageFetchState`, `googleCanonical`, `userCanonical` and `lastCrawlTime`.
3. **Stay inside the quota**: The API allows 2,000 inspections per property per day and 600 per minute. On larger sites, inspect the top pages every day and rotate through the rest of the sitemap over the week.
4. **Compare with the last verdict**: Keep each URL's result between runs. A page is newly not indexed when its verdict was `PASS` last time and is now `NEUTRAL` or `FAIL`, or when `googleCanonical` no longer matches `userCanonical`.
5. **Ask, with the cause**: Group dropped pages by cause (`BLOCKED_BY_META_TAG`, robots.txt `DISALLOWED`, `SOFT_404`, `SERVER_ERROR`, a canonical mismatch) and post one action card. Causes in code go to developers; "Crawled - currently not indexed" is a content question.

## Route B: the browser

### What you need

- Signed in to Google with at least Restricted access to the Search Console property; the URL Inspection tool works only on properties the account is a user of.

If something is missing, say what and stop; do not invent numbers.

### Steps

Start at https://search.google.com/search-console/index. The user is signed in already; never type passwords or codes, and ask if a sign-in page appears.

1. **Open the Page indexing report**: Pick the property; the URL lands on Indexing > Pages. Read the Not indexed and Indexed counts and the chart, then the `Why pages aren't indexed` table, which lists each reason with its page count and trend.
2. **Export the pages for each code reason**: Click `Excluded by 'noindex' tag`, `Blocked by robots.txt`, `Server error (5xx)`, `Soft 404` and `Duplicate, Google chose different canonical than user` in turn and use Export on each. Each list shows up to 1,000 URLs with the last crawl date.
3. **Compare with the last run**: Keep the exports between runs. A URL that appears in a reason list this time and was not there last time is newly dropped. Pages from your sitemap or your top pages by clicks matter most; `Crawled - currently not indexed` is a content question, not a code one.
4. **Inspect the important ones live**: Paste each newly dropped URL that matters into the `Inspect any URL` box at the top of Search Console. The result shows the verdict, the crawl date and both canonicals, which is fresher than the report.
5. **Ask with the cause**: Group dropped pages by reason, say which need a code fix and which are content issues, and ask who should take them. After a fix, the Validate fix button on that reason's page starts Google's recheck.

Note: The Page indexing report refreshes every few days, so it shows a drop later than daily API inspection would, and each reason list caps at 1,000 URLs. The Inspect box handles one URL at a time, so the browser route suits sites where a few dozen pages matter, not a 10,000-URL sitemap.

## The report

- **URLs inspected** and how many changed since the last run.
- **Newly not indexed**: each URL with Google's coverage state, the field behind it and the last crawl date.
- **Canonical changes**: pages where Google chose a canonical other than yours.
- The ask: who should fix what, split into code causes and content causes.

## Post it to Briefkin

When `BRIEFKIN_TOKEN` is set, or `~/.config/briefkin/env` exists (the installer from https://briefkin.dev/docs writes it), also send the result to the user's Briefkin board as one card. Keep the `item_key` the same on every run so the card updates in place, use a new `event_id` per run, and put today's real numbers in place of the example ones. If the request fails, say so once and carry on.

```bash
[ -n "${BRIEFKIN_TOKEN:-}" ] || . ~/.config/briefkin/env
curl -sS -X POST "${BRIEFKIN_URL:-https://briefkin.dev}/v1/events" \
  -H "authorization: Bearer $BRIEFKIN_TOKEN" \
  -H "content-type: application/json" \
  -d @- <<'JSON'
{
  "v": 1,
  "event_id": "google-search-console-indexing-issues/<date of this run, e.g. 2026-10-16>",
  "item_key": "google-search-console-indexing-issues",
  "project": "example.com",
  "source": "Search Console indexing issues skill",
  "kind": "action",
  "title": "5 pages dropped out of Google's index",
  "summary": "Inspected 640 sitemap URLs. **5 pages** that were indexed last week are not now, and 3 of the causes are in code: a noindex tag, a robots.txt rule and server errors.",
  "action": {
    "request": "Three of these need a code fix: /pricing/teams carries a noindex tag, /docs/api/webhooks is blocked by robots.txt and /integrations/xero returns 5xx. Should I draft a ticket for the developers?",
    "options": [
      "Draft the ticket",
      "I'll check today",
      "Expected, ignore these"
    ]
  },
  "widget": {
    "type": "Table",
    "props": {
      "columns": [
        "URL",
        "Coverage state",
        "Last crawl"
      ],
      "rows": [
        [
          "/pricing/teams",
          "Excluded by ‘noindex’ tag",
          "Oct 14"
        ],
        [
          "/docs/api/webhooks",
          "Blocked by robots.txt",
          "Oct 13"
        ],
        [
          "/integrations/xero",
          "Server error (5xx)",
          "Oct 15"
        ],
        [
          "/blog/invoice-vs-bill",
          "Duplicate, Google chose different canonical than user",
          "Oct 12"
        ],
        [
          "/templates/packing-slip",
          "Soft 404",
          "Oct 14"
        ]
      ]
    }
  }
}
JSON
```

Widgets come from the Briefkin catalog (https://briefkin.dev/v1/catalog). Without a token, just give the user the report.

## Run it on a schedule

Suggested: Weekdays at 7:00 (`0 7 * * 1-5`). From cron, with the agent signed in on that machine:

```bash
0 7 * * 1-5 claude -p "Run the google-search-console-indexing-issues skill"
# Codex: codex exec, Gemini CLI: gemini -p, Copilot CLI: copilot -p, OpenCode: opencode run
```

Or use the agent's own scheduler (Claude Code routines, Codex automations, Claude or ChatGPT scheduled tasks): https://briefkin.dev/skills/google-search-console-indexing-issues#schedule

Source: https://briefkin.dev/skills/google-search-console-indexing-issues

What your agent needs

  • Full or restricted user access to the Search Console property; URL inspection only works on properties you are a user of.

  • Search Console API access through an MCP server, a connector, or webmasters.readonly credentials, and a place to keep the last run's verdicts (a JSON file next to the skill is enough).

Connecting Google Search Console

  1. MCP server. Google doesn't publish one for Search Console. Community MCP servers exist; check which scopes one asks for before you sign in.
  2. API with a service account. Enable the Google Search Console API in a Google Cloud project, create a service account, and add its email under Settings > Users and permissions on the property. Point GOOGLE_APPLICATION_CREDENTIALS at the key and set GSC_SITE_URL to sc-domain:example.com or https://www.example.com/.
  3. OAuth as yourself. When you can't add users to the property, a desktop OAuth client with the webmasters.readonly scope and a stored refresh token works for scheduled runs.

Ask for webmasters.readonly and add the service account as a Restricted user; the reports only read.

Questions

Can the agent request indexing once a page is fixed?

No. The URL Inspection API reads index status but cannot ask Google to recrawl. Use Request indexing on the URL in Search Console after the fix is live; the next run confirms whether the page came back.

Does it test the live page?

No. It reports the version Google has indexed, which can be days old, so a page you already fixed keeps its old status until Google crawls it again. That is why every result shows lastCrawlTime.

Do I need Briefkin to use the Search Console indexing issues skill?

No. The skill runs with your own agent and gives you the report in the chat. With a Briefkin token set, each run also posts it to your board as a asks you, so you can glance at it instead of asking again.

Which agents can run it?

Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot CLI, OpenCode, Windsurf and Amp all read SKILL.md files. The install command puts it in ~/.claude/skills and ~/.agents/skills, where they look. ChatGPT, the Claude app and Grok take the prompt instead. Pick your agent under "Install and run it" and the commands change to match.

Can it work without an API or MCP server, from my browser?

Yes. Switch the data source to "Your browser" and the steps change to the Google Search Console pages themselves: the agent opens search.google.com/search-console/index in a browser you are signed in to and reads the numbers off the page. Claude Code, Codex, Cursor, Claude app and ChatGPT can drive a browser out of the box; Gemini CLI, Copilot CLI and OpenCode need a Playwright or Chrome DevTools MCP server first. It is slower than the API and needs you signed in, so it suits a report you run by hand or from a scheduler on your own computer.

Answer your agents from one board, or from Telegram

Skills are free to use with any agent. Briefkin is where their results land: one board for every report, number and question your agents send, with a ping when something needs you.

Free during the open beta. No card.