# Google Search Console

> Traps to avoid when querying Google Search Console through treg — cases where the API returns a confident wrong answer instead of an error, especially around totals and recent-date trends. Use whenever answering questions about organic search clicks, impressions, rankings, or index status.

- Skill: `superdesigndev/google-search-console` (Agent Skill)
- Install (CLI): `npx skillmds@latest add superdesigndev/google-search-console`
- Raw SKILL.md: https://api.skillmd.com/api/skills/superdesigndev/google-search-console/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Integrations & APIs
- Author: superdesigndev (https://skillmd.com/u/superdesigndev)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/superdesigndev/google-search-console

---


# Search Console via treg — what will silently mislead you

You already know the Search Console API. This file is **only** the things that return a plausible
wrong answer with no error. Verified live on 2026-07-22 against `sc-domain:example.com`, with
each trap confirmed by watching three independent agents.

Site id: `treg connections ls` → `resource_ref`. If it's empty, **no site is pinned** — list them
with `treg connections resources <id>` and say which one you chose and why. Don't present an
inferred site as configured, and don't report the blank as a fault — it isn't one.

When nothing is pinned and the question doesn't name a site, **pick the site whose domain matches
the question and state that you inferred it.** Note that subdomains are separate properties, so
`sc-domain:example.com` and `sc-domain:app.example.com` are different answers — say which you used.

## 1. Recent days are incomplete — do not report them as a trend

**3 of 3 agents concluded "organic traffic is down ~47%".** It wasn't.

GSC lags ~2–3 days and simply omits missing days — a 14-day request returns 11–12 rows with no
warning. Worse, the newest present days read low. The tail looked like this:

```
07-15: 640   07-16: 610   07-17: 500   07-18: 520   07-19: 430   ← last 3 days incomplete
```

Cross-checked against GA4 organic sessions for the same dates, the decline **does not exist** —
and GA4 shows 07-20 and 07-21 recovering to 746 and 849, days GSC hasn't reported at all.

**Two rules:**
- End ranges ≥3 days before today, and never start a window on a local peak.
- Before calling any GSC trend real, **cross-check GA4 organic sessions for the same dates.**
  Two independent sources disagreeing means the GSC tail is an artifact.

## 2. Dimension sums do NOT equal site totals

Illustrative (the point is that dimension sums miss the true total, not the absolutes):

| Grouped by | Rows | Impressions | vs true total |
|---|---|---|---|
| `query` | 4,219 | | **~31%** — loses ~69% |
| `page` | 1,161 | | **~151%** — overcounts ~51% |
| `date` | 28 | (true total) | 100% ✅ |
| *(none)* | 1 | (true total) | 100% ✅ |

`query` undercounts because Google drops anonymised rare queries; `page` overcounts because one
SERP impression showing several of your pages counts once per page. *(Numbers measured;
mechanisms are the standard explanation, not measured.)*

**Never sum a dimension to report a total** — especially for "how much traffic do my top queries
drive?", where summing understates organic traffic by ~69% with total confidence.

## 3. `searchAppearance` cannot be combined with any other dimension

Fails loudly with a 400: `"Cannot group by search appearance dimension together with another
dimension."` Query it alone — and note that a sparse result there is a correct answer, not a bug.

## 4. Two API surfaces on one host

- `webmasters/v3/...` — search analytics, sitemaps
- `v1/urlInspection/index:inspect` — URL Inspection

Guessing `webmasters/v3/urlInspection/...` returns a **Google HTML 404**, not a JSON error. Two of
three agents hit this. The HTML-vs-JSON tell is worth knowing generally: HTML means the path never
routed.

## Everything else

Standard API. `ctr` is a fraction (0.0882 = 8.82%); `position` is an average, so don't average it
across rows. `rowLimit` accepts 25000 (default reported as 1000 — unverified). Sitemap
`contents[].indexed` returned `"0"` for a fully-indexed site with 1,079 URLs — use URL Inspection
for real index status. Subdomains are separate properties.

Both `sc-domain:example.com` and `sc-domain%3Aexample.com` work in the path — verified via the
audit log. Encoding is optional; don't debug a 403 by adding it.

⚠️ *Unverified:* URL-prefix properties (`https://example.com/`, trailing slash) — none available
to test. A 403 is reported to usually mean the wrong property form rather than missing permission.

**Writes** (`PUT`/`DELETE` on sitemaps) change what Google crawls. Untested by design — get an
explicit target and human go-ahead first.

- Search Analytics query: https://developers.google.com/webmaster-tools/v1/searchanalytics/query
- URL Inspection: https://developers.google.com/webmaster-tools/v1/urlInspection.index/inspect
- Freshness & anonymisation: https://support.google.com/webmasters/answer/7576553

