Google's own SEO field data — PageSpeed Insights v5 + CrUX (real Chrome CWV, with 25-week history), Search Console (Search Analytics, URL Inspection, Sitemaps), Indexing API v3, GA4 organic traffic, YouTube/NLP/Knowledge-Graph/Web-Risk extras, and Ads Keyword Planner volume. Direct REST calls (curl via Bash, or WebFetch) against Google's own endpoints — bridges the gap between crawl-based analysis and what Google itself reports. Use when the user says "search console", "GSC", "PageSpeed", "Cr...
Scanned 9/11/2026
Install to Claude Code
npx -y skills add trungdo9/ClauKit --skill seo-google --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Seo Google?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/trungdo9-seo-google)More formats (shields.io, HTML) on the badges page.
---
name: seo-google
description: Google's own SEO field data — PageSpeed Insights v5 + CrUX (real Chrome CWV, with 25-week history), Search Console (Search Analytics, URL Inspection, Sitemaps), Indexing API v3, GA4 organic traffic, YouTube/NLP/Knowledge-Graph/Web-Risk extras, and Ads Keyword Planner volume. Direct REST calls (curl via Bash, or WebFetch) against Google's own endpoints — bridges the gap between crawl-based analysis and what Google itself reports. Use when the user says "search console", "GSC", "PageSpeed", "CrUX", "field data", "indexing API", "GA4 organic", "URL inspection", or "real CWV data".
allowed-tools: Read, Write, Glob, Grep, Bash, WebFetch
---
# SEO Google — Field Data From Google's Own APIs
> Crawl-based analysis is an estimate of what Google sees. These APIs are what Google actually reports: real Chrome user metrics, real indexation verdicts, real search performance. All of it is free.
## When this skill activates
**Implicit:** "check Core Web Vitals field data", "pull Search Console data", "is this URL indexed", "GA4 organic traffic", "submit this URL to Google", "CrUX history for this domain".
**Explicit:** "Use the seo-google skill to [task]."
**Routed from:** [[seo]] orchestrator — conditionally, when a GSC/PSI/GA4 connection is available; [[seo-technical]] (real CWV field data to supplement Lighthouse lab scores); the `campaign`/`write` measure phase in `/mk:seo campaign`.
## Scope
Covers:
- PageSpeed Insights v5 (Lighthouse lab scores) + CrUX field data + 25-week CrUX History trends.
- Search Console: Search Analytics (clicks/impressions/CTR/position), URL Inspection (single + batch), Sitemaps, Sites.
- Indexing API v3 (JobPosting/BroadcastEvent-eligible URLs only).
- GA4 Data API v1beta — raw `runReport`/`batchRunReports` calls for organic-traffic breakdowns.
- YouTube Data API (video SEO), Cloud NLP (entity/sentiment diagnostics — not an E-E-A-T score), Knowledge Graph (brand entity check), Web Risk (malware/phishing flag check).
- Google Ads Keyword Planner (gold-standard search volume — the source DataForSEO itself resells).
- Credential setup (API key vs. service account), rate limits/quotas, and the DMA/consent-mode-v2 caveats that affect how EU GSC/GA4 numbers should be read.
- Markdown report templates for CWV audits, GSC performance, and indexation status.
Does NOT cover:
- Crawl-based technical audits (site architecture, robots/sitemap *content*, JS rendering) → [[seo-technical]]. This skill supplies the CWV *field data* that audit consumes; it doesn't crawl the site itself.
- DataForSEO-sourced SERP/backlink/keyword-difficulty data → [[seo-dataforseo]]. Google Ads Keyword Planner (this skill) is the upstream volume source; DataForSEO is a paid alternative when Ads API access isn't set up.
- Schema/JSON-LD generation → [[seo-schema]]. URL Inspection here reports which rich-result types Google *detected*; it doesn't generate the markup.
- AI-Overviews/AI-Mode citation strategy → [[seo-geo]]. This skill can pull the GSC Generative-AI performance report (impressions only) as one input to that work.
**Boundary with `mcp-gsc` / `mcp-ga4`** (`skills/automation/`): those two skills are thin MCP-tool wrappers for the single most common GSC/GA4 read (`searchAnalytics`, `sitemaps`, one-URL `inspectUrl`, `listSites`; GA4 `runReport`) with a manual-CSV-export fallback when no MCP server is configured — reach for them first when an `mcp__gsc__*`/`mcp__ga4__*` tool is already wired up and covers the ask (simpler call surface, no auth wrangling). Use **this** skill when the ask needs something they don't expose — batch URL Inspection, sitemap submission, the Generative-AI performance report, DMA/consent-mode interpretation of the numbers — or for everything outside GSC/GA4 entirely (PSI/CrUX, Indexing API, YouTube, NLP, Keyword Planner, Knowledge Graph, Web Risk). Both paths hit the same Google APIs; don't run both for the same request.
## Credential tiers
Check `~/.config/claude-seo/google-api.json` (or `GOOGLE_API_KEY` / `GOOGLE_APPLICATION_CREDENTIALS` / `GA4_PROPERTY_ID` / `GSC_PROPERTY` env vars) before running anything. Full setup walkthrough: `references/auth-setup.md`.
| Tier | Detection | Unlocks |
|---|---|---|
| **0** — API key | `api_key` present | PageSpeed, CrUX, CrUX History, YouTube, NLP, Knowledge Graph, Web Risk |
| **1** — + Service account | OAuth token or service-account JSON | + Search Console (Analytics, Inspection, Sitemaps), Indexing API |
| **2** — + GA4 property | `ga4_property_id` configured | + GA4 organic traffic reports |
| **3** — + Ads access | `ads_developer_token` + `ads_customer_id` | + Keyword Planner (ideas, volume) |
Always state the detected tier before running a command, and name which of the sections below are unavailable at the current tier.
## PageSpeed Insights + CrUX (field data)
Full endpoint/response reference: `references/pagespeed-crux-api.md`.
- **PSI v5** (`GET https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=<url>&key=<key>`) — Lighthouse lab scores (performance/accessibility/best-practices/SEO) plus a same-call CrUX snapshot. Google is migrating field data out of PSI, so prefer CrUX directly for field data and use PSI mainly for the lab scores.
- **CrUX** (`POST https://chromeuxreport.googleapis.com/v1/records:queryRecord`, API key in `X-Goog-Api-Key` header) — 28-day p75 for LCP/INP/CLS/FCP/TTFB. `404` means insufficient Chrome traffic, not an auth error. **CLS p75 is string-encoded** (`"0.05"`) — always parse as float.
- **CrUX History** (`POST .../records:queryHistoryRecord`) — same request shape, returns up to 25 weekly collection periods as a timeseries. Updates Mondays ~04:00 UTC; watch for `"NaN"` density strings and `null` percentiles in ineligible periods.
Core Web Vitals thresholds (current as of 2026-07-09; INP replaced FID on 2024-03-12 — never reference FID):
| Metric | Good | Needs Improvement | Poor |
|---|---|---|---|
| LCP | ≤ 2,500ms | 2,500–4,000ms | > 4,000ms |
| INP | ≤ 200ms | 200–500ms | > 500ms |
| CLS | ≤ 0.1 | 0.1–0.25 | > 0.25 |
| FCP | ≤ 1,800ms | 1,800–3,000ms | > 3,000ms |
| TTFB | ≤ 800ms | 800–1,800ms | > 1,800ms |
## Search Console
Full reference (request/response shapes, filters, pagination): `references/search-console-api.md`.
- **Search Analytics** (`POST .../webmasters/v3/sites/{siteUrl}/searchAnalytics/query`) — clicks/impressions/CTR/position by query/page/country/device/date. 2–3 day lag, ~16 months of history. Query- and page-level rows can silently omit anonymized low-volume traffic, so **never sum them for a site total** — run a separate dimensionless aggregate query for that, and only present it as authoritative once it comes back complete. Detect quick wins: queries at position 4–10 with high impressions.
- **AI surfaces (2026):** the dedicated **Generative AI performance** report (impressions only, no clicks/CTR/position; Pages/Countries/Devices/Dates; 1,000-row cap) is the only clean way to see AI Overviews + AI Mode visibility — AI Mode traffic otherwise rolls into standard Web totals, so it can't be split out after the fact.
- **Data-reliability caveat:** a GSC logging bug made impressions/CTR/average-position **unreliable from 2025-05-13 to 2026-04-27** (clicks unaffected, fixed forward-only, no backfill). Flag any trend that spans that window.
- **URL Inspection** (`POST .../urlInspection/index:inspect`, single or batched from a file) — the indexation *truth*: verdict (PASS/FAIL/NEUTRAL/PARTIAL), coverage state, robots.txt state, indexing state, page-fetch state, Google-selected vs. user-declared canonical, detected rich-result types. Note that FAQPage (retired 2026-05-07) and HowTo (retired 2023) no longer produce rich results — don't expect them. Rate-limited to 2,000/day, 600/min per site.
- **Sitemaps** (`GET/PUT/DELETE .../sitemaps`) — submitted-count/error/warning status only. This reports what was *submitted*, not what's indexed — use URL Inspection for the indexation truth on specific URLs.
## Indexing API v3
Full reference: `references/indexing-api.md`.
`POST https://indexing.googleapis.com/v3/urlNotifications:publish` with `{"url": ..., "type": "URL_UPDATED"|"URL_DELETED"}` (batches of up to 100 via `multipart/mixed`). **This API is scoped to JobPosting and BroadcastEvent/VideoObject pages only** — always say so before using it on an ordinary page; a `URL_UPDATED` ping there only nudges a recrawl, no ranking benefit. For ordinary URLs: URL Inspection for a few, sitemaps for many. Quota: 200 publish/day (resets midnight Pacific), tracked per project.
## GA4 organic traffic
Full reference (dimensions, metrics, filter expressions, Python example): `references/ga4-data-api.md`.
`POST https://analyticsdata.googleapis.com/v1beta/{property=properties/*}:runReport` filtered to `sessionDefaultChannelGroup = "Organic Search"`. Useful dimensions: `landingPage`, `pagePath`, `deviceCategory`, `country`; metrics: `sessions`, `totalUsers`, `bounceRate`, `engagementRate`, `keyEvents` (replaced deprecated `conversions`). Token-budgeted, not request-counted — pass `returnPropertyQuota: true` to watch spend (25K tokens/day, 5K/hour, 10 concurrent per property).
**GA4 "AI Assistants" channel (live ~2026-05-13):** sessions from a recognized AI assistant (ChatGPT, Gemini, Claude, Deepseek, Copilot, Grok) get `medium=ai-assistant` — but it excludes Google AI Overviews/AI Mode, Perplexity needs separate verification, and most AI-referred sessions arrive referrer-less and land in Direct. Treat it as a floor on AI traffic, not the full count.
## YouTube, NLP, Knowledge Graph, Web Risk
Free, API-key-only extras. Full references: `references/youtube-api.md`, `references/nlp-api.md`, `references/supplementary-apis.md`.
| API | Use | Quota |
|---|---|---|
| YouTube Data API v3 | Video SEO — search (`search.list`, 100 units), video details + top comments (`videos.list`/`commentThreads.list`, ~1 unit each) | 10,000 units/day |
| Cloud NLP | Entity/sentiment/classification diagnostics for internal content-quality checks — **not** a Google E-E-A-T score, never present it as one | 5,000 units/month free (entities/sentiment); billing must be enabled |
| Knowledge Graph Search | Brand/entity presence check — does the site have a Knowledge Panel, is the entity disambiguated | 100,000 reads/day |
| Web Risk | Malware/social-engineering flag check — can explain a deindexing | 6,000 QPM, 100K/month free |
Some third-party GEO research reports a correlation between YouTube mentions and AI-search visibility — treat that as a methodology-dependent signal, not a Google-sourced benchmark.
## Keyword Planner (Google Ads)
Full reference: `references/keyword-planner-api.md`.
`GenerateKeywordIdeas` / `GenerateKeywordHistoricalMetrics` — the volume source DataForSEO itself resells, so this is the more direct read when Ads API access exists (developer token + customer ID, Tier 3). Without active ad spend on the account, volumes come back as bucketed ranges ("1K–10K") rather than exact numbers — say so when reporting a bucketed figure. Competition score measures *advertiser* competition, not organic ranking difficulty.
## DMA / consent-mode v2 — reading EU numbers correctly
Full note: `references/dma-consent-mode-v2.md`. The Digital Markets Act (in force since 2024-03-07) and GA4/Ads consent-mode v2 change what EU numbers mean, not what to recommend:
- **GSC:** EU CTR comparisons that straddle 2024-03-07 aren't apples-to-apples — flag it, don't silently trend it.
- **GA4:** EU organic sessions under a "denied ad_storage / granted analytics_storage" consent default are systematically under-counted (conversion modelling fills the gap; raw counts stay low). Surface the consent-mode config if the GA4 admin API exposes it.
- Do **not** lecture on cookie-consent UX (legal/engineering, out of scope) and do **not** recommend "switch to cookieless attribution" — Google abandoned third-party-cookie deprecation in 2024 and confirmed in 2025 there's no standalone Chrome cookie prompt coming. Recommend consent-mode v2 + server-side tagging for EU compliance and signal recovery instead.
## Rate limits & error handling
Consolidated table + exponential-backoff strategy: `references/rate-limits-quotas.md`.
| API | Per-minute | Per-day |
|---|---|---|
| PSI v5 | 240 | 25,000 |
| CrUX + History (shared) | 150 | unlimited |
| GSC Search Analytics | 1,200/site | 30M/project |
| GSC URL Inspection | 600/site | 2,000/site |
| Indexing API | 380 total | 200 publish |
| GA4 Data API | 10 concurrent | ~25K tokens |
| Scenario | Action |
|---|---|
| No credentials configured | Walk through `references/auth-setup.md`. List which Tier-0 (API-key-only) calls still work. |
| `403` on GSC/GA4 | Service-account `client_email` not added to the property, or wrong permission level. |
| `404` on CrUX | Insufficient Chrome traffic — not an auth error. Fall back to PSI lab data. |
| `429` | Exponential backoff (1s, 2s, 4s, 8s, 16s + jitter); honor `Retry-After` if present. |
| Indexing quota exceeded | Report the 200/day cap; prioritize the most important URLs; suggest sitemaps for the rest. |
## Reports
After analysis, offer to write a markdown report from the templates in `assets/templates/`:
| Template | Fed by |
|---|---|
| `cwv-audit-report.md` | PSI + CrUX + CrUX History |
| `gsc-performance-report.md` | Search Analytics |
| `indexation-status-report.md` | Batch URL Inspection |
Fill the `{placeholder}` fields from the API responses above; leave a field `[NEEDS DATA]` rather than inventing a number.
## Key concepts
- **Field data vs. lab data** — CrUX/PSI's `loadingExperience` block is real Chrome-user telemetry (field); Lighthouse's `lighthouseResult` is a single synthetic run (lab). Field data is the ranking signal; lab data is the diagnostic.
- **Indexation truth** — sitemaps report what was *submitted*; URL Inspection reports what Google actually *did* with it. Never infer indexation from a sitemap alone.
- **Bucketed vs. exact volume** — Keyword Planner without ad spend returns ranges, not point estimates. Report the range, don't collapse it to a fake midpoint.
- **NLP entities are a diagnostic, not a score** — Cloud NLP salience/sentiment inform internal content review; they are not Google's E-E-A-T weighting.
## Output
- Inline findings in the conversation (CWV ratings, quick-win queries, indexation verdicts).
- A markdown report from `assets/templates/` when the user wants an artifact: `plans/marketing/<site>/GOOGLE-API-REPORT-{domain}.md`.
- Raw JSON saved alongside a report when the user needs it for a later `/mk:seo campaign` measure cycle.
## Cross-references
- `plans/marketing-context.md` — required hub
- [[seo]] — orchestrator; dispatches here when a GSC/PSI/GA4 connection is available
- [[seo-technical]] — consumes CrUX field data to supplement its Lighthouse lab audit
- [[seo-dataforseo]] — paid alternative for SERP/backlink/volume data when Ads API access isn't set up
- [[seo-geo]] — consumes the GSC Generative-AI performance report for AI-citation work
- `skills/automation/mcp-gsc/SKILL.md`, `skills/automation/mcp-ga4/SKILL.md` — lighter MCP-tool wrappers for the single most common GSC/GA4 read; see the boundary note above
- `.claude/workflows/marketing-rules.md` — content quality rules
## Provenance
Imported from `AgriciDaniel/claude-seo` and adapted for KitForge. The source skill drove all calls through its own `claude-seo run <script>.py` CLI harness, which ClauKit doesn't ship — adapted here to direct REST calls (curl via Bash, or WebFetch) against the same Google endpoints, with routing to `mcp-gsc`/`mcp-ga4` noted where those wrappers already cover the ask. Endpoint shapes, quotas, and the 2026 GSC/GA4 AI-surface and DMA/consent-mode notes are preserved from source.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!