{"id":"05bb0b39-755e-4027-be45-4b40dd5a0f0d","shortId":"RcfGxB","kind":"skill","title":"seo-hreflang","tagline":"Hreflang and international SEO audit for multi-language and multi-region sites. Validates language-region codes, return tags, x-default, canonical alignment, and conflict detection across the per-URL HTML, the SE Ranking audit, and the XML sitemap. Use when the user asks \"hreflan","description":"# Hreflang Audit\n\nAdapted from `AgriciDaniel/claude-seo`'s `seo-hreflang` skill (MIT). Concept and validation rules originate there; this implementation is rebuilt against our backend (SE Ranking MCP + Firecrawl + WebFetch + Google APIs via `seo-google`).\n\nValidate hreflang implementations on a multi-language or multi-region site. Surface SE Ranking audit-level hreflang issues, parse a sample of pages for the actual `<link rel=\"alternate\" hreflang=\"…\">` tags they emit, cross-check the sitemap, and produce one of three verdicts — **PASS**, **NEEDS-FIX**, or **BROKEN** — with a top-fixes table anchored in objective signals.\n\n## Prerequisites\n\n- SE Ranking MCP server connected.\n- Claude's `WebFetch` tool available (fallback when Firecrawl is unavailable).\n- User provides: a target domain (e.g. `example.com`). Optional: explicit list of representative pages to inventory; explicit sitemap URL if not at `/sitemap.xml`.\n- **Predecessor (recommended):** `seo-technical-audit` or `seo-sitemap` already run on this domain. Without an existing audit, the skill creates one (which costs significantly more credits).\n\n## Process\n\n1. **Validate target & preflight.** See `skills/seo-firecrawl/references/preflight.md` for the canonical 3-stage preflight (credit balance, Firecrawl availability, Google APIs). Skill-specific notes:\n   - Normalise domain (strip protocol, trailing slash) before continuing.\n   - Estimated SE Ranking cost for this skill: ~5–10 SE Ranking credits for re-using an existing audit (up to ~3 Firecrawl credits for the per-URL inventory).\n   - Firecrawl: optional with WebFetch fallback, ~6 Firecrawl credits if available (hard cap). When available, step 4 (per-URL hreflang inventory) runs on homepage + 5 representative pages with `formats: [\"rawHtml\"]`. Without Firecrawl, step 4 falls back to WebFetch — coverage is degraded because WebFetch returns markdown only and silently strips `<link rel=\"alternate\">` tags from `<head>`. Pass `--no-firecrawl` to force WebFetch even when Firecrawl is available.\n   - Google APIs: tier 1 (GSC) unlocks step 6 (GSC verification of hreflang-targeted alternates). See `skills/seo-google/references/cross-skill-integration.md` for the full enrichment contract.\n\n2. **Find or refresh the audit** `DATA_listAudits` → `DATA_getAuditStatus`\n   - List audits for the domain. If a recent audit exists (<30 days), use it.\n   - If older than 30 days, run `DATA_recheckAudit` and wait for `done`.\n   - If none exists, ask the user before creating one with `DATA_createStandardAudit` — it consumes credits.\n\n3. **Pull SE Ranking's hreflang findings** `DATA_getAuditReport` + `DATA_getAuditPagesByIssue`\n   - SE Ranking's audit catches hreflang errors directly — surface them first as ground truth.\n   - From `DATA_getAuditReport`, extract every issue with code or category matching `hreflang` (typical codes: `hreflang_no_return_tag`, `hreflang_invalid_lang_code`, `hreflang_conflict`, `hreflang_missing_x_default`, `hreflang_canonical_mismatch`, `hreflang_no_self_reference`).\n   - For each significant hreflang issue (count ≥ 1), call `DATA_getAuditPagesByIssue` to enumerate the affected URLs.\n   - Persist to `01-audit-hreflang-issues.md` and feed into `hreflang-issues.csv`.\n\n4. **Per-URL hreflang tag inventory** `mcp__firecrawl-mcp__firecrawl_scrape` (preferred) / `WebFetch` (fallback)\n   - **Sample selection:** homepage + up to 5 representative pages from `DATA_getDomainPages` (sort by traffic descending; bias toward pages on different language paths if the URL structure exposes them — `/en/`, `/fr/`, `/de/`, etc.).\n   - **Firecrawl path** (1 credit per URL, ~6 total): call `firecrawl_scrape(url=..., formats=[\"rawHtml\"])`. Pin `rawHtml` — the default `html` post-processing strips `<link rel=\"alternate\">` on many sites. Parse every `<link rel=\"alternate\" hreflang=\"…\" href=\"…\">` from the `<head>`. Capture: source URL, hreflang attribute, href, and whether it's self-referencing.\n   - **WebFetch fallback** (no Firecrawl): try fetching each URL and extracting hreflang from the markdown response. WebFetch frequently returns markdown that has stripped `<head>` link tags, so this path will under-report. Note in `HREFLANG-REPORT.md`: `Per-URL inventory: degraded coverage — Firecrawl not installed; some hreflang tags may be missed.`\n   - **Apply validation rules** (see references/validation-rules.md for the full list):\n     - **Self-referencing tag:** the page's own URL must appear in its own hreflang set.\n     - **Return tags:** every alternate link must reciprocate. If page A lists B as `fr`, page B must list A as `en` (or whichever).\n     - **x-default:** at least one alternate per set must use `hreflang=\"x-default\"`.\n     - **Language-region code validation:** every value must be a valid ISO 639-1 language (optionally followed by `-` and an ISO 3166-1 Alpha-2 region). Common errors caught: `eng` (use `en`), `jp` (use `ja`), `en-uk` (use `en-GB`), `es-LA` (no such ISO region).\n     - **Conflict detection:** the same hreflang value (e.g. `de-DE`) appearing on multiple distinct URLs is a conflict — Google ignores conflicting sets.\n     - **Canonical alignment:** if the page has `<link rel=\"canonical\">`, it must match the page's own URL (or its self-referencing hreflang URL). Hreflang on a non-canonical page is silently ignored by Google.\n     - **Protocol consistency:** all URLs in a set must share the same scheme (HTTPS preferred).\n   - Persist to `02-per-url-hreflang.md` and append findings to `hreflang-issues.csv`.\n\n5. **Sitemap-level hreflang** (defer to `seo-sitemap` where appropriate)\n   - If the user's domain uses sitemap-based hreflang (`<xhtml:link rel=\"alternate\" …>` inside the sitemap), this skill checks structure and consistency only. Full sitemap analysis (orphans, missing pages, broken entries) is `seo-sitemap`'s job — recommend it explicitly if a sitemap-vs-audit diff is in scope.\n   - **Fetch the sitemap.** Try `https://{domain}/sitemap.xml`; if 404, fetch `/robots.txt` and find `Sitemap:` directives. For sitemap-of-sitemaps, recursively fetch each child.\n   - **Validate hreflang within the sitemap:**\n     - Does the sitemap use the `xmlns:xhtml=\"http://www.w3.org/1999/xhtml\"` namespace? Required for hreflang in sitemaps.\n     - Does each `<url>` entry that has hreflang alternates include itself in the alternate set (self-reference)?\n     - Does every alternate listed in one `<url>` entry reciprocate as its own `<url>` entry with the same alternate set (return tags)?\n     - Are language-region codes valid (apply same rules as step 4)?\n   - **Cross-check against per-URL inventory (step 4):** if a sample URL's HTML lists 4 hreflang alternates but the sitemap entry for that URL lists 6, that mismatch is a conflict — Google may pick either, and inconsistency degrades the signal.\n   - Persist to `03-sitemap-hreflang.md` and append findings to `hreflang-issues.csv`.\n\n6. **GSC verification of hreflang-targeted alternates** *(only if google-api.json is present, tier ≥ 1)*\n   - For each unique domain that appears as an `href` target in the hreflang sets (e.g. `example.com`, `example.de`, `example.fr`), confirm GSC verification:\n     `python3 scripts/gsc_query.py --property \"{property}\" --json` (a status-only check; just confirm the property responds without `PROPERTY_NOT_VERIFIED`).\n   - **Why this matters:** Google explicitly recommends verifying every domain that participates in a cross-domain hreflang setup. If `example.de` is listed as an alternate but isn't verified in this account, the hreflang signal is weakened and you can't see how Google interprets it.\n   - Surface in `HREFLANG-REPORT.md` as a section \"## GSC verification of hreflang targets\" with one row per target domain: `verified` / `not verified` / `not configured`.\n   - If property not verified for a target domain: list it as a fix at Medium severity (\"Verify {domain} in Google Search Console — required for cross-domain hreflang trust\").\n   - See `skills/seo-google/references/cross-skill-integration.md` § \"Trigger pattern\" for the failure-mode contract.\n\n7. **Synthesise verdict**\n   - Apply the verdict heuristic (see Tips) to produce **PASS**, **NEEDS-FIX**, or **BROKEN**.\n   - Sort `hreflang-issues.csv` by severity descending, then count descending.\n   - Write `HREFLANG-REPORT.md` with the top-fixes table (top 10) and the verdict.\n\n## Output format\n\nCreate a folder `seo-hreflang-{target-slug}-{YYYYMMDD}/` with:\n\n```\nseo-hreflang-{target-slug}-{YYYYMMDD}/\n├── 01-audit-hreflang-issues.md   (SE Ranking audit findings filtered to hreflang)\n├── 02-per-url-hreflang.md         (per-URL <link rel=\"alternate\"> inventory + validation findings)\n├── 03-sitemap-hreflang.md         (sitemap-level hreflang validation; defer details to seo-sitemap)\n├── evidence/\n│   ├── homepage-rawhtml.html      (raw HTML from Firecrawl, for the homepage sample)\n│   ├── sample-{n}-rawhtml.html    (raw HTML for each sampled URL)\n│   └── sitemap.xml                (raw fetched sitemap)\n├── hreflang-issues.csv            (load-bearing: URL, issue code, severity, fix)\n└── HREFLANG-REPORT.md             (PRIMARY: verdict + top fixes table)\n```\n\n`HREFLANG-REPORT.md` follows this shape:\n\n```markdown\n# Hreflang Audit: {domain}\n\n> Audit date {YYYY-MM-DD} · Sample size: {n} URLs · Languages detected: {comma-separated list}\n\n## Verdict: {PASS | NEEDS-FIX | BROKEN}\n\nReasoning: {1–2 sentences anchored in concrete numbers from the data}.\n\n## Summary\n\n| Source | Findings | Severity breakdown |\n|---|---|---|\n| SE Ranking audit | {n} | Critical: {n} · High: {n} · Medium: {n} · Low: {n} |\n| Per-URL HTML inventory | {n} | … |\n| Sitemap | {n} | … |\n\n## Top fixes (impact-ranked)\n\n| # | URL | Issue | Severity | Fix |\n|---|---|---|---|---|\n| 1 | {URL} | {issue code} | {severity} | {one-line fix} |\n| 2 | … | … | … | … |\n| ... up to 10 |\n\n## Languages detected\n\n| Language | URL count | Self-ref OK | Return tags OK | x-default OK |\n|---|---|---|---|---|\n| en-US | {n} | ✓ / ✗ {count} | ✓ / ✗ | ✓ / ✗ |\n| de-DE | {n} | … | … | … |\n| ... |\n\n## Per-URL inventory ({n} URLs sampled)\n\n| URL | Alternates | Self-ref | x-default | Notable issues |\n|---|---|---|---|---|\n| {URL} | {n} | ✓/✗ | ✓/✗ | {short text} |\n| ... |\n\n## Sitemap-level hreflang\n- xhtml namespace declared: {✓/✗}\n- URLs with hreflang alternates: {n}\n- Self-reference within sitemap: {✓ all / ✗ {count} missing}\n- Return tags within sitemap: {✓ all / ✗ {count} missing}\n- Per-URL HTML vs sitemap consistency: {✓ all match / ✗ {count} mismatched}\n- Full sitemap-vs-audit analysis: see `seo-sitemap` (orphans, broken entries, lastmod).\n\n## GSC verification of hreflang targets\n\n| Domain | Verified | Notes |\n|---|---|---|\n| {domain1} | ✓ / ✗ | {note if unverified} |\n| ... |\n\n(Or: `GSC verification: not configured (run bash extensions/google/install.sh)`.)\n\n## Coverage notes\n\n- Per-URL inventory tool: {Firecrawl rawHtml | WebFetch fallback (degraded — some hreflang tags may be missed)}.\n- Pages sampled: homepage + {n} representative pages (selection: top traffic from `DATA_getDomainPages`).\n\n## Apply\n\n- Walk `hreflang-issues.csv` row-by-row; each row is one specific change (URL + issue + fix).\n- After applying changes, re-run `seo-technical-audit` to refresh SE Ranking's findings, then re-run this skill to verify.\n```\n\n`hreflang-issues.csv` columns: `url,issue_code,severity,fix,source` where `source` is one of `audit | html | sitemap | gsc`.\n\n## Tips\n\n- Respect SE Ranking Data API rate limit: 10 req/sec.\n- Reuse existing audits when possible — creating a new audit is by far the most expensive operation in this skill.\n- **Verdict heuristic:**\n  - **PASS:** zero Critical findings; ≤ 2 High findings; sample URLs all have self-reference, x-default, and reciprocal return tags; all language-region codes valid; canonical aligns with self-ref hreflang.\n  - **NEEDS-FIX:** any High finding; or > 5 Medium findings; or any one of (missing x-default, missing return tags on > 25% of sampled pages, language-region code error, sitemap-vs-HTML mismatch).\n  - **BROKEN:** any Critical finding; or hreflang attempted but no self-reference on the homepage; or canonical pointing elsewhere on a page that nonetheless emits hreflang (entire set is ignored by Google); or > 50% of sampled URLs missing return tags.\n- Anchor every claim in `HREFLANG-REPORT.md` to a row in `hreflang-issues.csv`. If a stakeholder questions the verdict, walk them through the CSV.\n- For sites with > 50 language variants per page, the per-URL HTML implementation bloats the `<head>` — recommend the sitemap-based implementation instead. Don't generate code; the deliverable is diagnostic, not code-gen.\n- The skill **does not** assess cultural adaptation, content parity, or locale formatting. Those are translation/QA concerns; they're orthogonal to whether hreflang itself is technically correct. If the user wants those, point them at the translation team — this skill answers \"is the technical hreflang signal working?\", not \"is the localised content good?\".\n- For cross-domain hreflang (e.g. `example.com` ↔ `example.de`), step 6's GSC check is the highest-value enrichment — verifying both domains is Google's explicit recommendation.\n- **Common false-positive guard:** if a sampled page legitimately has no internationalization (e.g. a single-region site), zero hreflang tags is correct, not an issue. The skill detects this by checking whether *any* sampled page emits hreflang; if none do, the verdict is PASS with note \"No hreflang implementation detected — single-language site.\"\n- Pair with `seo-sitemap` for the sitemap-vs-audit diff; pair with `seo-technical-audit` for full technical health. This skill is narrow: hreflang correctness only.\n- See `references/validation-rules.md` for the full per-issue rule table (severity, detection logic, suggested fix).","tags":["seo","hreflang","skills","seranking","agent-skills","ai-search","anthropic","backlinks","claude","claude-code","claude-plugin","claude-skills"],"capabilities":["skill","source-seranking","skill-seo-hreflang","topic-agent-skills","topic-ai-search","topic-anthropic","topic-backlinks","topic-claude","topic-claude-code","topic-claude-plugin","topic-claude-skills","topic-content-brief","topic-ga4","topic-keyword-research","topic-mcp"],"categories":["seo-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/seranking/seo-skills/seo-hreflang","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add seranking/seo-skills","source_repo":"https://github.com/seranking/seo-skills","install_from":"skills.sh"}},"qualityScore":"0.454","qualityRationale":"deterministic score 0.45 from registry signals: · indexed on github topic:agent-skills · 9 github stars · SKILL.md body (13,815 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T19:08:36.474Z","embedding":null,"createdAt":"2026-05-18T13:14:10.077Z","updatedAt":"2026-05-18T19:08:36.474Z","lastSeenAt":"2026-05-18T19:08:36.474Z","tsv":"'-1':708,717 '-2':719 '/1999/xhtml':921 '/de':538 '/en':536 '/fr':537 '/robots.txt':893 '/sitemap.xml':184,889 '01-audit-hreflang-issues.md':487,1246 '02-per-url-hreflang.md':815,1254 '03-sitemap-hreflang.md':1020,1261 '1':214,340,476,542,1040,1342,1386 '10':252,1222,1398,1612 '2':359,1343,1395,1639 '25':1691 '3':223,265,410 '30':379,386 '3166':716 '4':289,307,492,974,984,992 '404':891 '5':251,298,513,821,1676 '50':1738,1769 '6':279,344,546,1003,1026,1862 '639':707 '7':1188 'account':1112 'across':33 'actual':116 'adapt':55,1807 'affect':483 'agricidaniel/claude-seo':57 'align':29,767,1663 'alpha':718 'alreadi':195 'altern':351,660,686,846,934,939,946,959,994,1033,1105,1432,1455 'analysi':859,1488 'anchor':143,1345,1745 'answer':1840 'api':83,231,338,1609 'appear':651,754,1046 'append':817,1022 'appli':632,969,1191,1547,1564 'appropri':832 'ask':51,398 'assess':1805 'attempt':1711 'attribut':574 'audit':8,42,54,105,190,203,262,364,370,377,424,879,1249,1317,1319,1359,1487,1572,1600,1616,1622,1946,1953 'audit-level':104 'avail':157,229,283,287,336 'b':668,672 'back':309 'backend':76 'balanc':227 'base':841,1786 'bash':1515 'bear':1299 'bias':523 'bloat':1780 'breakdown':1356 'broken':136,863,1204,1340,1494,1705 'call':477,548 'canon':28,222,464,766,792,1662,1721 'cap':285 'captur':570 'catch':425 'categori':444 'caught':723 'chang':1559,1565 'check':122,852,977,1071,1865,1912 'child':906 'claim':1747 'claud':153 'code':22,442,448,456,698,967,1302,1389,1591,1660,1698,1792,1799 'code-gen':1798 'column':1588 'comma':1332 'comma-separ':1331 'common':721,1880 'concept':64 'concern':1816 'concret':1347 'configur':1148,1513 'confirm':1059,1073 'conflict':31,458,744,761,764,1008 'connect':152 'consist':800,855,1478 'consol':1170 'consum':408 'content':1808,1851 'continu':243 'contract':358,1187 'correct':1826,1903,1963 'cost':209,247 'count':475,1211,1403,1419,1463,1470,1481 'coverag':312,622,1517 'creat':206,402,1228,1619 'createstandardaudit':406 'credit':212,226,255,267,281,409,543 'critic':1361,1637,1707 'cross':121,976,1095,1174,1855 'cross-check':120,975 'cross-domain':1094,1173,1854 'csv':1765 'cultur':1806 'data':365,367,389,405,417,419,436,478,517,1351,1545,1608 'date':1320 'day':380,387 'dd':1324 'de':752,753,1421,1422 'de-d':751,1420 'declar':1451 'default':27,462,557,682,694,1413,1438,1651,1686 'defer':826,1267 'degrad':314,621,1015,1528 'deliver':1794 'descend':522,1209,1212 'detail':1268 'detect':32,745,1330,1400,1909,1931,1976 'diagnost':1796 'diff':880,1947 'differ':527 'direct':428,897 'distinct':757 'domain':167,199,237,373,837,888,1044,1089,1096,1143,1156,1166,1175,1318,1502,1856,1874 'domain1':1505 'done':394 'e.g':168,750,1055,1858,1893 'either':1012 'elsewher':1723 'emit':119,1729,1917 'en':677,726,731,735,1416 'en-gb':734 'en-uk':730 'en-us':1415 'eng':724 'enrich':357,1871 'entir':1731 'entri':864,930,950,955,998,1495 'enumer':481 'error':427,722,1699 'es':738 'es-la':737 'estim':244 'etc':539 'even':332 'everi':439,567,659,700,945,1088,1746 'evid':1273 'example.com':169,1056,1859 'example.de':1057,1100,1860 'example.fr':1058 'exist':202,261,378,397,1615 'expens':1628 'explicit':171,178,873,1085,1878 'expos':534 'extensions/google/install.sh':1516 'extract':438,592 'failur':1185 'failure-mod':1184 'fall':308 'fallback':158,278,507,584,1527 'fals':1882 'false-posit':1881 'far':1625 'feed':489 'fetch':588,884,892,904,1294 'filter':1251 'find':360,416,818,895,1023,1250,1260,1354,1578,1638,1641,1674,1678,1708 'firecrawl':80,160,228,266,274,280,305,328,334,501,503,540,549,586,623,1278,1524 'firecrawl-mcp':500 'first':431 'fix':134,141,1161,1202,1219,1304,1309,1339,1378,1385,1394,1562,1593,1671,1979 'folder':1230 'follow':711,1312 'forc':330 'format':302,552,1227,1812 'fr':670 'frequent':599 'full':356,639,857,1483,1955,1969 'gb':736 'gen':1800 'generat':1791 'getauditpagesbyissu':420,479 'getauditreport':418,437 'getauditstatus':368 'getdomainpag':518,1546 'good':1852 'googl':82,87,230,337,762,798,1009,1084,1124,1168,1736,1876 'google-api.json':1036 'ground':433 'gsc':341,345,1027,1060,1133,1497,1510,1603,1864 'guard':1884 'hard':284 'health':1957 'heurist':1194,1634 'high':1363,1640,1673 'highest':1869 'highest-valu':1868 'homepag':297,510,1281,1537,1719 'homepage-rawhtml.html':1274 'href':575,1049 'hreflan':52 'hreflang':3,4,53,61,89,107,293,349,415,426,446,449,453,457,459,463,466,473,496,573,593,627,655,691,748,785,787,825,842,908,925,933,993,1031,1053,1097,1114,1136,1176,1233,1241,1253,1265,1316,1448,1454,1500,1530,1668,1710,1730,1822,1844,1857,1900,1918,1929,1962 'hreflang-issues.csv':491,820,1025,1206,1296,1549,1587,1754 'hreflang-report.md':616,1129,1214,1305,1311,1749 'hreflang-target':348,1030 'html':38,558,990,1276,1287,1372,1475,1601,1703,1778 'https':811 'ignor':763,796,1734 'impact':1380 'impact-rank':1379 'implement':71,90,1779,1787,1930 'includ':935 'inconsist':1014 'insid':847 'instal':625 'instead':1788 'intern':6 'internation':1892 'interpret':1125 'invalid':454 'inventori':177,273,294,498,620,982,1258,1373,1427,1522 'isn':1107 'iso':706,715,742 'issu':108,440,474,1301,1383,1388,1440,1561,1590,1906,1972 'ja':729 'job':870 'jp':727 'json':1066 'la':739 'lang':455 'languag':12,20,95,528,696,709,965,1329,1399,1401,1658,1696,1770,1934 'language-region':19,695,964,1657,1695 'lastmod':1496 'least':684 'legitim':1889 'level':106,824,1264,1447 'limit':1611 'line':1393 'link':605,661,844 'list':172,369,640,667,674,947,991,1002,1102,1157,1334 'listaudit':366 'load':1298 'load-bear':1297 'local':1811 'localis':1850 'logic':1977 'low':1367 'mani':564 'markdown':318,596,601,1315 'match':445,774,1480 'matter':1083 'may':629,1010,1532 'mcp':79,150,499,502 'medium':1163,1365,1677 'mismatch':465,1005,1482,1704 'miss':460,631,861,1464,1471,1534,1683,1687,1742 'mit':63 'mm':1323 'mode':1186 'multi':11,15,94,98 'multi-languag':10,93 'multi-region':14,97 'multipl':756 'must':650,662,673,689,702,773,806 'n':1284,1327,1360,1362,1364,1366,1368,1374,1376,1418,1423,1428,1442,1456,1538 'namespac':922,1450 'narrow':1961 'need':133,1201,1338,1670 'needs-fix':132,1200,1337,1669 'new':1621 'no-firecrawl':326 'non':791 'non-canon':790 'none':396,1920 'nonetheless':1728 'normalis':236 'notabl':1439 'note':235,614,1504,1506,1518,1927 'number':1348 'object':145 'ok':1407,1410,1414 'older':384 'one':127,207,403,685,949,1139,1392,1557,1598,1681 'one-lin':1391 'oper':1629 'option':170,275,710 'origin':68 'orphan':860,1493 'orthogon':1819 'output':1226 'page':113,175,300,515,525,646,665,671,770,776,793,862,1535,1540,1694,1726,1773,1888,1916 'pair':1936,1948 'pariti':1809 'pars':109,566 'particip':1091 'pass':131,325,1199,1336,1635,1925 'path':529,541,609 'pattern':1181 'per':36,271,291,494,544,618,687,980,1141,1256,1370,1425,1473,1520,1772,1776,1971 'per-issu':1970 'per-url':35,270,290,493,617,979,1255,1369,1424,1472,1519,1775 'persist':485,813,1018 'pick':1011 'pin':554 'point':1722,1832 'posit':1883 'possibl':1618 'post':560 'post-process':559 'predecessor':185 'prefer':505,812 'preflight':217,225 'prerequisit':147 'present':1038 'primari':1306 'process':213,561 'produc':126,1198 'properti':1064,1065,1075,1078,1150 'protocol':239,799 'provid':164 'pull':411 'python3':1062 'question':1758 'rank':41,78,103,149,246,254,413,422,1248,1358,1381,1576,1607 'rate':1610 'raw':1275,1286,1293 'rawhtml':303,553,555,1525 'rawhtml.html':1285 're':258,1567,1581,1818 're-run':1566,1580 're-us':257 'reason':1341 'rebuilt':73 'recent':376 'recheckaudit':390 'reciproc':663,951,1653 'recommend':186,871,1086,1782,1879 'recurs':903 'ref':1406,1435,1667 'refer':469,943,1459,1648,1716 'referenc':582,643,784 'references/validation-rules.md':636,1966 'refresh':362,1574 'region':16,21,99,697,720,743,966,1659,1697,1897 'rel':845 'report':613 'repres':174,299,514,1539 'req/sec':1613 'requir':923,1171 'respect':1605 'respond':1076 'respons':597 'return':23,317,451,600,657,961,1408,1465,1654,1688,1743 'reus':1614 'row':1140,1551,1553,1555,1752 'row-by-row':1550 'rule':67,634,971,1973 'run':196,295,388,1514,1568,1582 'sampl':111,508,987,1282,1283,1290,1325,1430,1536,1642,1693,1740,1887,1915 'scheme':810 'scope':883 'scrape':504,550 'scripts/gsc_query.py':1063 'se':40,77,102,148,245,253,412,421,1247,1357,1575,1606 'search':1169 'section':1132 'see':218,352,635,1122,1178,1195,1489,1965 'select':509,1541 'self':468,581,642,783,942,1405,1434,1458,1647,1666,1715 'self-ref':1404,1433,1665 'self-refer':941,1457,1646,1714 'self-referenc':580,641,782 'sentenc':1344 'seo':2,7,60,86,188,193,829,867,1232,1240,1271,1491,1570,1939,1951 'seo-googl':85 'seo-hreflang':1,59,1231,1239 'seo-sitemap':192,828,866,1270,1490,1938 'seo-technical-audit':187,1569,1950 'separ':1333 'server':151 'set':656,688,765,805,940,960,1054,1732 'setup':1098 'sever':1164,1208,1303,1355,1384,1390,1592,1975 'shape':1314 'share':807 'short':1443 'signal':146,1017,1115,1845 'signific':210,472 'silent':321,795 'singl':1896,1933 'single-languag':1932 'single-region':1895 'site':17,100,565,1767,1898,1935 'sitemap':46,124,179,194,823,830,840,849,858,868,877,886,896,900,902,911,914,927,997,1263,1272,1295,1375,1446,1461,1468,1477,1485,1492,1602,1701,1785,1940,1944 'sitemap-bas':839,1784 'sitemap-level':822,1262,1445 'sitemap-of-sitemap':899 'sitemap-vs-audit':876,1484,1943 'sitemap-vs-html':1700 'sitemap.xml':1292 'size':1326 'skill':62,205,233,250,851,1584,1632,1802,1839,1908,1959 'skill-seo-hreflang' 'skill-specif':232 'skills/seo-firecrawl/references/preflight.md':219 'skills/seo-google/references/cross-skill-integration.md':353,1179 'slash':241 'slug':1236,1244 'sort':519,1205 'sourc':571,1353,1594,1596 'source-seranking' 'specif':234,1558 'stage':224 'stakehold':1757 'status':1069 'status-on':1068 'step':288,306,343,973,983,1861 'strip':238,322,562,604 'structur':533,853 'suggest':1978 'summari':1352 'surfac':101,429,1127 'synthesis':1189 'tabl':142,1220,1310,1974 'tag':24,117,323,452,497,606,628,644,658,962,1409,1466,1531,1655,1689,1744,1901 'target':166,216,350,1032,1050,1137,1142,1155,1235,1243,1501 'target-slug':1234,1242 'team':1837 'technic':189,1571,1825,1843,1952,1956 'text':1444 'three':129 'tier':339,1039 'tip':1196,1604 'tool':156,1523 'top':140,1218,1221,1308,1377,1542 'top-fix':139,1217 'topic-agent-skills' 'topic-ai-search' 'topic-anthropic' 'topic-backlinks' 'topic-claude' 'topic-claude-code' 'topic-claude-plugin' 'topic-claude-skills' 'topic-content-brief' 'topic-ga4' 'topic-keyword-research' 'topic-mcp' 'total':547 'toward':524 'traffic':521,1543 'trail':240 'translat':1836 'translation/qa':1815 'tri':587,887 'trigger':1180 'trust':1177 'truth':434 'typic':447 'uk':732 'unavail':162 'under-report':611 'uniqu':1043 'unlock':342 'unverifi':1508 'url':37,180,272,292,484,495,532,545,551,572,590,619,649,758,779,786,802,981,988,1001,1257,1291,1300,1328,1371,1382,1387,1402,1426,1429,1431,1441,1452,1474,1521,1560,1589,1643,1741,1777 'us':1417 'use':47,259,381,690,725,728,733,838,915 'user':50,163,400,835,1829 'valid':18,66,88,215,633,699,705,907,968,1259,1266,1661 'valu':701,749,1870 'variant':1771 'verdict':130,1190,1193,1225,1307,1335,1633,1760,1923 'verif':346,1028,1061,1134,1498,1511 'verifi':1080,1087,1109,1144,1146,1152,1165,1503,1586,1872 'via':84 'vs':878,1476,1486,1702,1945 'wait':392 'walk':1548,1761 'want':1830 'weaken':1117 'webfetch':81,155,277,311,316,331,506,583,598,1526 'whether':577,1821,1913 'whichev':679 'within':909,1460,1467 'without':200,304,1077 'work':1846 'write':1213 'www.w3.org':920 'www.w3.org/1999/xhtml':919 'x':26,461,681,693,1412,1437,1650,1685 'x-default':25,680,692,1411,1436,1649,1684 'xhtml':843,918,1449 'xml':45 'xmlns':917 'yyyi':1322 'yyyy-mm-dd':1321 'yyyymmdd':1237,1245 'zero':1636,1899","prices":[{"id":"305338fa-930b-45e3-9f7c-da5e90880737","listingId":"05bb0b39-755e-4027-be45-4b40dd5a0f0d","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"seranking","category":"seo-skills","install_from":"skills.sh"},"createdAt":"2026-05-18T13:14:10.077Z"}],"sources":[{"listingId":"05bb0b39-755e-4027-be45-4b40dd5a0f0d","source":"github","sourceId":"seranking/seo-skills/seo-hreflang","sourceUrl":"https://github.com/seranking/seo-skills/tree/main/skills/seo-hreflang","isPrimary":false,"firstSeenAt":"2026-05-18T13:14:10.077Z","lastSeenAt":"2026-05-18T19:08:36.474Z"}],"details":{"listingId":"05bb0b39-755e-4027-be45-4b40dd5a0f0d","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"seranking","slug":"seo-hreflang","github":{"repo":"seranking/seo-skills","stars":9,"topics":["agent-skills","ai-search","answer-engine-optimization","anthropic","backlinks","claude","claude-code","claude-plugin","claude-skills","content-brief","ga4","generative-engine-optimization","keyword-research","mcp","mcp-server","search-console","seo","seo-tools","seranking","site-audit"],"license":"mit","html_url":"https://github.com/seranking/seo-skills","pushed_at":"2026-05-11T20:07:40Z","description":"Claude SEO Skills — production Claude Agent Skills for the SE Ranking MCP server. Content briefs, AI Search share of voice, audits, backlink gaps, keyword clusters, schema, sitemap, GEO, and more.","skill_md_sha":"8189e4048a63a91c0ed0a3a00d83c71ad30a98c2","skill_md_path":"skills/seo-hreflang/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/seranking/seo-skills/tree/main/skills/seo-hreflang"},"layout":"multi","source":"github","category":"seo-skills","frontmatter":{"name":"seo-hreflang","description":"Hreflang and international SEO audit for multi-language and multi-region sites. Validates language-region codes, return tags, x-default, canonical alignment, and conflict detection across the per-URL HTML, the SE Ranking audit, and the XML sitemap. Use when the user asks \"hreflang\", \"international SEO\", \"i18n\", \"language targeting\", \"x-default\", \"regional sites\", or \"multi-language SEO\"."},"skills_sh_url":"https://skills.sh/seranking/seo-skills/seo-hreflang"},"updatedAt":"2026-05-18T19:08:36.474Z"}}