optbrew 0.0.0-stage → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +6 -0
- package/.claude-plugin/plugin.json +6 -0
- package/.codex-plugin/plugin.json +13 -0
- package/CHANGELOG.md +20 -0
- package/LICENSE +21 -0
- package/README.ko.md +73 -0
- package/README.md +72 -2
- package/THIRD_PARTY_NOTICES.md +10 -0
- package/bin/optbrew.mjs +4 -0
- package/docs/platforms.md +31 -0
- package/docs/release.md +14 -0
- package/lib/cli.mjs +103 -0
- package/lib/doctor.mjs +44 -0
- package/lib/install.mjs +158 -0
- package/lib/paths.mjs +30 -0
- package/lib/records.mjs +44 -0
- package/lib/transaction.mjs +205 -0
- package/lib/update.mjs +181 -0
- package/package.json +39 -4
- package/plugin.json +13 -0
- package/skills/optbrew/LICENSE +21 -0
- package/skills/optbrew/SKILL.md +17 -0
- package/skills/optbrew/THIRD_PARTY_NOTICES.md +10 -0
- package/skills/optbrew/agents/openai.yaml +4 -0
- package/skills/optbrew/bundle-manifest.json +663 -0
- package/skills/optbrew/licenses/firecrawl-seo-audit.txt +15 -0
- package/skills/optbrew/licenses/magnus-seo.txt +21 -0
- package/skills/optbrew/licenses/marketing-search.txt +21 -0
- package/skills/optbrew/licenses/mblode-seo.txt +21 -0
- package/skills/optbrew/licenses/naver-searchadvisor.txt +29 -0
- package/skills/optbrew/licenses/seranking-seo.txt +21 -0
- package/skills/optbrew/modules/firecrawl-seo-audit/GUIDE.md +64 -0
- package/skills/optbrew/modules/magnus-seo/GUIDE.md +79 -0
- package/skills/optbrew/modules/magnus-seo/README.md +45 -0
- package/skills/optbrew/modules/magnus-seo/assets/audit-report-template.md +76 -0
- package/skills/optbrew/modules/magnus-seo/references/aeo-methodology.md +105 -0
- package/skills/optbrew/modules/magnus-seo/references/agent-readable-content.md +28 -0
- package/skills/optbrew/modules/magnus-seo/references/content-and-entity-architecture.md +100 -0
- package/skills/optbrew/modules/magnus-seo/references/content-strategy-seo.md +142 -0
- package/skills/optbrew/modules/magnus-seo/references/discovery-and-freshness.md +47 -0
- package/skills/optbrew/modules/magnus-seo/references/evidence-boundaries.md +75 -0
- package/skills/optbrew/modules/magnus-seo/references/ghost-metadata.md +204 -0
- package/skills/optbrew/modules/magnus-seo/references/implementation-playbook.md +114 -0
- package/skills/optbrew/modules/magnus-seo/references/measurement-and-experimentation.md +47 -0
- package/skills/optbrew/modules/magnus-seo/references/onpage-seo.md +154 -0
- package/skills/optbrew/modules/magnus-seo/references/platform-guidance.md +30 -0
- package/skills/optbrew/modules/magnus-seo/references/schema-markup.md +244 -0
- package/skills/optbrew/modules/magnus-seo/references/source-index.md +36 -0
- package/skills/optbrew/modules/magnus-seo/references/structured-data.md +56 -0
- package/skills/optbrew/modules/magnus-seo/references/technical-seo.md +99 -0
- package/skills/optbrew/modules/magnus-seo/scripts/aeo_audit.py +158 -0
- package/skills/optbrew/modules/magnus-seo/scripts/build_prompt_matrix.py +52 -0
- package/skills/optbrew/modules/magnus-seo/templates/aeo-implementation-plan.md +53 -0
- package/skills/optbrew/modules/magnus-seo/templates/citation-observation-log.md +16 -0
- package/skills/optbrew/modules/magnus-seo/templates/llms.txt.template +15 -0
- package/skills/optbrew/modules/magnus-seo/templates/question-cluster.md +27 -0
- package/skills/optbrew/modules/magnus-seo/templates/robots-ai-crawlers.txt +23 -0
- package/skills/optbrew/modules/marketing-search/skills/ai-seo/GUIDE.md +483 -0
- package/skills/optbrew/modules/marketing-search/skills/ai-seo/references/agent-readiness.md +57 -0
- package/skills/optbrew/modules/marketing-search/skills/ai-seo/references/citations-vs-recommendations.md +85 -0
- package/skills/optbrew/modules/marketing-search/skills/ai-seo/references/content-patterns.md +287 -0
- package/skills/optbrew/modules/marketing-search/skills/ai-seo/references/content-types.md +71 -0
- package/skills/optbrew/modules/marketing-search/skills/ai-seo/references/format-volatility.md +98 -0
- package/skills/optbrew/modules/marketing-search/skills/ai-seo/references/okf.md +104 -0
- package/skills/optbrew/modules/marketing-search/skills/ai-seo/references/platform-ranking-factors.md +154 -0
- package/skills/optbrew/modules/marketing-search/skills/ai-seo/references/youtube-ai-citations.md +60 -0
- package/skills/optbrew/modules/marketing-search/skills/analytics/GUIDE.md +303 -0
- package/skills/optbrew/modules/marketing-search/skills/analytics/references/event-library.md +260 -0
- package/skills/optbrew/modules/marketing-search/skills/analytics/references/ga4-implementation.md +300 -0
- package/skills/optbrew/modules/marketing-search/skills/analytics/references/gtm-implementation.md +390 -0
- package/skills/optbrew/modules/marketing-search/skills/content-strategy/GUIDE.md +432 -0
- package/skills/optbrew/modules/marketing-search/skills/content-strategy/references/content-distribution.md +83 -0
- package/skills/optbrew/modules/marketing-search/skills/content-strategy/references/headless-cms.md +194 -0
- package/skills/optbrew/modules/marketing-search/skills/programmatic-seo/GUIDE.md +231 -0
- package/skills/optbrew/modules/marketing-search/skills/programmatic-seo/references/playbooks.md +308 -0
- package/skills/optbrew/modules/marketing-search/skills/schema/GUIDE.md +172 -0
- package/skills/optbrew/modules/marketing-search/skills/schema/references/schema-examples.md +398 -0
- package/skills/optbrew/modules/marketing-search/skills/seo-audit/GUIDE.md +492 -0
- package/skills/optbrew/modules/marketing-search/skills/seo-audit/references/ai-writing-detection.md +200 -0
- package/skills/optbrew/modules/marketing-search/skills/seo-audit/references/international-seo.md +230 -0
- package/skills/optbrew/modules/marketing-search/skills/site-architecture/GUIDE.md +350 -0
- package/skills/optbrew/modules/marketing-search/skills/site-architecture/references/mermaid-templates.md +216 -0
- package/skills/optbrew/modules/marketing-search/skills/site-architecture/references/navigation-patterns.md +305 -0
- package/skills/optbrew/modules/marketing-search/skills/site-architecture/references/site-type-templates.md +293 -0
- package/skills/optbrew/modules/mblode-seo/GUIDE.md +74 -0
- package/skills/optbrew/modules/mblode-seo/references/answer-engines.md +58 -0
- package/skills/optbrew/modules/mblode-seo/references/audit.md +78 -0
- package/skills/optbrew/modules/mblode-seo/references/brief-template.md +47 -0
- package/skills/optbrew/modules/mblode-seo/references/monitoring.md +56 -0
- package/skills/optbrew/modules/mblode-seo/references/nextjs-implementation.md +65 -0
- package/skills/optbrew/modules/mblode-seo/references/research-protocol.md +37 -0
- package/skills/optbrew/modules/mblode-seo/references/sources.md +47 -0
- package/skills/optbrew/modules/mblode-seo/references/validation-evidence.md +21 -0
- package/skills/optbrew/modules/naver-searchadvisor/GUIDE.md +75 -0
- package/skills/optbrew/modules/naver-searchadvisor/NOTICE.md +59 -0
- package/skills/optbrew/modules/naver-searchadvisor/references/INDEX.md +97 -0
- package/skills/optbrew/modules/naver-searchadvisor/scripts/audit.mjs +714 -0
- package/skills/optbrew/modules/naver-searchadvisor/scripts/robots.mjs +77 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-ai-search-share-of-voice/GUIDE.md +94 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-api/GUIDE.md +186 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-api/references/api-surface-map.md +207 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-api/references/auth-and-keys.md +182 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-api/references/integration-patterns.md +283 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-api/references/rate-limits-and-credits.md +235 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-competitor-gap-analysis/GUIDE.md +117 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-content-audit/GUIDE.md +155 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-content-audit/references/cite.md +84 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-content-audit/references/core-eeat.md +147 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-content-audit/templates/verdict.md +63 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-firecrawl/GUIDE.md +141 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-firecrawl/references/preflight.md +73 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-geo/GUIDE.md +159 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-google/GUIDE.md +393 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-google/assets/templates/cwv-audit-report.md +48 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-google/assets/templates/gsc-performance-report.md +44 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-google/assets/templates/indexation-status-report.md +43 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-google/references/auth-setup.md +160 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-google/references/cross-skill-integration.md +187 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-google/references/ga4-data-api.md +184 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-google/references/indexing-api.md +109 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-google/references/keyword-planner-api.md +66 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-google/references/nlp-api.md +55 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-google/references/pagespeed-crux-api.md +204 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-google/references/rate-limits-quotas.md +75 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-google/references/search-console-api.md +156 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-google/references/supplementary-apis.md +99 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-google/references/youtube-api.md +49 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-keyword-niche/GUIDE.md +174 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-page/GUIDE.md +174 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-plan/GUIDE.md +220 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-schema/GUIDE.md +135 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-schema/references/google-rich-results.md +89 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-schema/templates/article.json +23 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-schema/templates/breadcrumb-list.json +18 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-schema/templates/faq-page.json +22 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-schema/templates/local-business.json +32 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-schema/templates/product.json +25 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-sitemap/GUIDE.md +128 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-technical-audit/GUIDE.md +235 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-technical-audit/references/severity-mapping.md +133 -0
- package/skills/optbrew/references/api.md +45 -0
- package/skills/optbrew/references/check-registry.json +28 -0
- package/skills/optbrew/references/evidence.md +9 -0
- package/skills/optbrew/references/intake.md +9 -0
- package/skills/optbrew/references/measurement.md +29 -0
- package/skills/optbrew/references/policies.md +7 -0
- package/skills/optbrew/references/profiles.json +13 -0
- package/skills/optbrew/references/remediations.json +12 -0
- package/skills/optbrew/references/report.md +25 -0
- package/skills/optbrew/references/routing.md +15 -0
- package/skills/optbrew/references/schemas/contract.schema.json +51 -0
- package/skills/optbrew/references/scoring.md +62 -0
- package/skills/optbrew/scripts/adapters/anthropic.mjs +116 -0
- package/skills/optbrew/scripts/adapters/imports.mjs +81 -0
- package/skills/optbrew/scripts/audit.mjs +145 -0
- package/skills/optbrew/scripts/cli.mjs +41 -0
- package/skills/optbrew/scripts/core/bootstrap.mjs +31 -0
- package/skills/optbrew/scripts/core/bundle.mjs +73 -0
- package/skills/optbrew/scripts/core/capabilities.mjs +19 -0
- package/skills/optbrew/scripts/core/collector.mjs +236 -0
- package/skills/optbrew/scripts/core/compare.mjs +47 -0
- package/skills/optbrew/scripts/core/contracts.mjs +144 -0
- package/skills/optbrew/scripts/core/cost-ledger.mjs +95 -0
- package/skills/optbrew/scripts/core/findings.mjs +54 -0
- package/skills/optbrew/scripts/core/metrics.mjs +97 -0
- package/skills/optbrew/scripts/core/protocol.mjs +125 -0
- package/skills/optbrew/scripts/core/report.mjs +652 -0
- package/skills/optbrew/scripts/core/scope.mjs +52 -0
- package/skills/optbrew/scripts/core/score.mjs +71 -0
- package/skills/optbrew/scripts/core/weights.mjs +139 -0
- package/skills/optbrew/source-lock.json +2686 -0
- package/source-lock.json +2686 -0
package/skills/optbrew/modules/seranking-seo/skills/seo-google/references/keyword-planner-api.md
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# Google Ads API - Keyword Planner Reference
|
|
2
|
+
|
|
3
|
+
Gold-standard source for keyword search volume. DataForSEO gets its volume data from Google Ads -- this cuts out the middleman.
|
|
4
|
+
|
|
5
|
+
## Prerequisites (More Complex Than Other Google APIs)
|
|
6
|
+
|
|
7
|
+
1. **Google Ads Manager Account** -- create at ads.google.com (free to create)
|
|
8
|
+
2. **Developer Token** -- apply at Google Ads API Center (requires Basic access approval)
|
|
9
|
+
3. **OAuth 2.0 credentials** -- reuse existing OAuth client from seo-google config
|
|
10
|
+
4. **For exact volumes**: Run a minimal campaign (~$5-10/day). Without spend, volumes are bucketed ranges ("1K-10K")
|
|
11
|
+
|
|
12
|
+
## Key Methods
|
|
13
|
+
|
|
14
|
+
### GenerateKeywordIdeas
|
|
15
|
+
Generate keyword suggestions from seed terms.
|
|
16
|
+
|
|
17
|
+
**Returns per keyword:**
|
|
18
|
+
- `text`: Keyword string
|
|
19
|
+
- `avg_monthly_searches`: Average monthly volume (exact if spending, bucketed if not)
|
|
20
|
+
- `competition`: LOW / MEDIUM / HIGH (for ads, not organic)
|
|
21
|
+
- `competition_index`: 0-100 competition score
|
|
22
|
+
- `low_top_of_page_bid_micros`: ~20th percentile CPC in micros
|
|
23
|
+
- `high_top_of_page_bid_micros`: ~80th percentile CPC in micros
|
|
24
|
+
- `monthly_search_volumes[]`: Per-month volume for last 12 months
|
|
25
|
+
|
|
26
|
+
### GenerateKeywordHistoricalMetrics
|
|
27
|
+
Get volume data for specific keywords.
|
|
28
|
+
|
|
29
|
+
Same return fields as above but for exact keyword list instead of suggestions.
|
|
30
|
+
|
|
31
|
+
### GenerateKeywordForecastMetrics
|
|
32
|
+
Predict clicks, impressions, and cost for keywords.
|
|
33
|
+
|
|
34
|
+
## Configuration
|
|
35
|
+
|
|
36
|
+
Add to `~/.config/seo-skills/google-api.json`:
|
|
37
|
+
|
|
38
|
+
```json
|
|
39
|
+
{
|
|
40
|
+
"ads_developer_token": "YOUR_DEV_TOKEN",
|
|
41
|
+
"ads_customer_id": "123-456-7890",
|
|
42
|
+
"ads_login_customer_id": "123-456-7890"
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Rate Limits
|
|
47
|
+
|
|
48
|
+
- Keyword Planning requests are more strictly rate-limited than other Ads API services
|
|
49
|
+
- Exact QPM/QPS not publicly documented
|
|
50
|
+
- Google recommends caching results
|
|
51
|
+
|
|
52
|
+
## Python Library
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
pip install google-ads
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Uses `google-ads` library (separate from `google-api-python-client`).
|
|
59
|
+
|
|
60
|
+
## Important Notes
|
|
61
|
+
|
|
62
|
+
- **Volume accuracy**: Without active ad spend, Google returns bucketed ranges ("1K-10K", "10K-100K") instead of exact numbers like "14,800"
|
|
63
|
+
- **Competition score**: Measures advertiser competition for ads, NOT organic ranking difficulty
|
|
64
|
+
- **CPC bids**: Reflect what advertisers pay, useful for estimating keyword commercial value
|
|
65
|
+
- **Location targeting**: Use location IDs (2840 = United States, 2826 = United Kingdom)
|
|
66
|
+
- **Language targeting**: Use language IDs (1000 = English, 1003 = Spanish)
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# Google Cloud Natural Language API Reference
|
|
2
|
+
|
|
3
|
+
NLP analysis enhances E-E-A-T scoring by measuring entity coverage, content sentiment, and topic classification using Google's own taxonomy.
|
|
4
|
+
|
|
5
|
+
## Endpoint
|
|
6
|
+
|
|
7
|
+
`POST https://language.googleapis.com/v2/documents:annotateText?key={API_KEY}`
|
|
8
|
+
|
|
9
|
+
## Features
|
|
10
|
+
|
|
11
|
+
| Feature | What It Does | SEO Use |
|
|
12
|
+
|---------|-------------|---------|
|
|
13
|
+
| `extractEntities` | Extract people, orgs, places, events with salience scores | Topic coverage depth, entity optimization |
|
|
14
|
+
| `extractDocumentSentiment` | Document + sentence-level sentiment score/magnitude | Content tone assessment |
|
|
15
|
+
| `classifyText` | Map content to 700+ Google categories | Topic relevance verification |
|
|
16
|
+
| `moderateText` | Content safety/moderation categories | Content quality flags |
|
|
17
|
+
|
|
18
|
+
## Entity Types
|
|
19
|
+
|
|
20
|
+
PERSON, LOCATION, ORGANIZATION, EVENT, WORK_OF_ART, CONSUMER_GOOD, OTHER, PHONE_NUMBER, ADDRESS, DATE, NUMBER, PRICE
|
|
21
|
+
|
|
22
|
+
Each entity includes:
|
|
23
|
+
- `name`: Entity text
|
|
24
|
+
- `type`: Entity type
|
|
25
|
+
- `salience`: Importance score (0-1, higher = more relevant)
|
|
26
|
+
- `sentiment`: Per-entity sentiment (score + magnitude)
|
|
27
|
+
- `metadata`: Wikipedia URL, MID (Knowledge Graph ID)
|
|
28
|
+
- `mentions`: Occurrences in the text
|
|
29
|
+
|
|
30
|
+
## Sentiment Scoring
|
|
31
|
+
|
|
32
|
+
- **Score**: -1.0 (negative) to +1.0 (positive)
|
|
33
|
+
- **Magnitude**: 0 to infinity (emotional intensity, higher = more emotional)
|
|
34
|
+
- Neutral content: score ~0, low magnitude
|
|
35
|
+
- Mixed content: score ~0, HIGH magnitude (both positive and negative)
|
|
36
|
+
|
|
37
|
+
## Pricing
|
|
38
|
+
|
|
39
|
+
| Feature | Free/month | Paid (per 1K chars) |
|
|
40
|
+
|---------|-----------|-------------------|
|
|
41
|
+
| Entity Analysis | 5,000 units | $0.001 |
|
|
42
|
+
| Sentiment Analysis | 5,000 units | $0.001 |
|
|
43
|
+
| Content Classification | 30,000 units | $0.002 |
|
|
44
|
+
| Text Moderation | 50,000 units | $0.0005 |
|
|
45
|
+
|
|
46
|
+
One "unit" = 1,000 characters. Free tier resets monthly.
|
|
47
|
+
|
|
48
|
+
## Enable the API
|
|
49
|
+
|
|
50
|
+
1. Go to [console.cloud.google.com/apis/library](https://console.cloud.google.com/apis/library)
|
|
51
|
+
2. Search for "Cloud Natural Language API"
|
|
52
|
+
3. Click Enable
|
|
53
|
+
4. **Billing must be enabled** on the project (free tier still applies)
|
|
54
|
+
|
|
55
|
+
Uses the same API key as PSI/CrUX.
|
package/skills/optbrew/modules/seranking-seo/skills/seo-google/references/pagespeed-crux-api.md
ADDED
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
# PageSpeed Insights v5 + CrUX API Reference
|
|
2
|
+
|
|
3
|
+
## Table of Contents
|
|
4
|
+
1. [PageSpeed Insights v5](#pagespeed-insights-v5)
|
|
5
|
+
2. [CrUX API (Daily)](#crux-api-daily)
|
|
6
|
+
3. [CrUX History API (Weekly)](#crux-history-api-weekly)
|
|
7
|
+
4. [Core Web Vitals Thresholds](#core-web-vitals-thresholds)
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## PageSpeed Insights v5
|
|
12
|
+
|
|
13
|
+
**Endpoint:** `GET https://www.googleapis.com/pagespeedonline/v5/runPagespeed`
|
|
14
|
+
|
|
15
|
+
### Parameters
|
|
16
|
+
|
|
17
|
+
| Param | Type | Description |
|
|
18
|
+
|-------|------|-------------|
|
|
19
|
+
| `url` | string | Required. URL to analyze. |
|
|
20
|
+
| `category` | string | `ACCESSIBILITY`, `BEST_PRACTICES`, `PERFORMANCE`, `SEO`. Can specify multiple. |
|
|
21
|
+
| `strategy` | string | `DESKTOP` or `MOBILE` (default). |
|
|
22
|
+
| `locale` | string | Locale for text (e.g., `en`). |
|
|
23
|
+
| `key` | string | API key. Optional but recommended for quota. |
|
|
24
|
+
|
|
25
|
+
### Response Structure
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
{
|
|
29
|
+
"id": "https://example.com/",
|
|
30
|
+
"loadingExperience": { ... }, // URL-level CrUX data
|
|
31
|
+
"originLoadingExperience": { ... }, // Origin-level CrUX data
|
|
32
|
+
"lighthouseResult": {
|
|
33
|
+
"categories": {
|
|
34
|
+
"performance": { "score": 0.85 },
|
|
35
|
+
"accessibility": { "score": 0.92 },
|
|
36
|
+
"best-practices": { "score": 0.88 },
|
|
37
|
+
"seo": { "score": 0.95 }
|
|
38
|
+
},
|
|
39
|
+
"audits": { ... } // Individual audit results
|
|
40
|
+
},
|
|
41
|
+
"analysisUTCTimestamp": "2026-03-27T..."
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### Field Data Metrics (in loadingExperience)
|
|
46
|
+
|
|
47
|
+
| PSI Key | CrUX Metric | Unit |
|
|
48
|
+
|---------|-------------|------|
|
|
49
|
+
| `LARGEST_CONTENTFUL_PAINT_MS` | LCP | ms |
|
|
50
|
+
| `INTERACTION_TO_NEXT_PAINT` | INP | ms |
|
|
51
|
+
| `CUMULATIVE_LAYOUT_SHIFT_SCORE` | CLS | unitless |
|
|
52
|
+
| `FIRST_CONTENTFUL_PAINT_MS` | FCP | ms |
|
|
53
|
+
| `EXPERIMENTAL_TIME_TO_FIRST_BYTE` | TTFB | ms |
|
|
54
|
+
|
|
55
|
+
Each metric contains: `percentile` (p75), `distributions[]` ({min, max, proportion}), `category` (FAST/AVERAGE/SLOW/NONE).
|
|
56
|
+
|
|
57
|
+
### Key Lighthouse Audit IDs
|
|
58
|
+
|
|
59
|
+
`first-contentful-paint`, `largest-contentful-paint`, `total-blocking-time`, `cumulative-layout-shift`, `speed-index`, `interactive`
|
|
60
|
+
|
|
61
|
+
### Rate Limits
|
|
62
|
+
- 25,000 QPD with API key
|
|
63
|
+
- 240 QPM
|
|
64
|
+
- Free, no billing required
|
|
65
|
+
|
|
66
|
+
### Note on Field Data Migration
|
|
67
|
+
Google is migrating CrUX field data out of PSI. For field data, prefer the CrUX API directly. Use PSI primarily for Lighthouse lab data.
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## CrUX API (Daily)
|
|
72
|
+
|
|
73
|
+
**Endpoint:** `POST https://chromeuxreport.googleapis.com/v1/records:queryRecord?key={API_KEY}`
|
|
74
|
+
|
|
75
|
+
### Request
|
|
76
|
+
|
|
77
|
+
```json
|
|
78
|
+
{
|
|
79
|
+
"origin": "https://example.com",
|
|
80
|
+
"formFactor": "PHONE",
|
|
81
|
+
"metrics": ["largest_contentful_paint", "interaction_to_next_paint", "cumulative_layout_shift"]
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
| Field | Description |
|
|
86
|
+
|-------|-------------|
|
|
87
|
+
| `origin` | Origin URL (mutually exclusive with `url`) |
|
|
88
|
+
| `url` | Specific page URL (mutually exclusive with `origin`) |
|
|
89
|
+
| `formFactor` | `DESKTOP`, `PHONE`, `TABLET` (optional, omit for all) |
|
|
90
|
+
| `metrics` | Array of metric names (optional, omit for all) |
|
|
91
|
+
|
|
92
|
+
### Available Metrics
|
|
93
|
+
|
|
94
|
+
| Metric | Type | Notes |
|
|
95
|
+
|--------|------|-------|
|
|
96
|
+
| `largest_contentful_paint` | int (ms) | Core Web Vital |
|
|
97
|
+
| `interaction_to_next_paint` | int (ms) | Core Web Vital (replaced FID) |
|
|
98
|
+
| `cumulative_layout_shift` | **string** | Core Web Vital. **String-encoded!** Parse carefully. |
|
|
99
|
+
| `first_contentful_paint` | int (ms) | |
|
|
100
|
+
| `experimental_time_to_first_byte` | int (ms) | |
|
|
101
|
+
| `round_trip_time` | int (ms) | Replaced effectiveConnectionType (Feb 2025) |
|
|
102
|
+
| `navigation_types` | fractions | navigate, navigate_cache, reload, etc. |
|
|
103
|
+
| `form_factors` | fractions | desktop/phone/tablet distribution |
|
|
104
|
+
|
|
105
|
+
### Response
|
|
106
|
+
|
|
107
|
+
```json
|
|
108
|
+
{
|
|
109
|
+
"record": {
|
|
110
|
+
"key": { "origin": "https://example.com" },
|
|
111
|
+
"metrics": {
|
|
112
|
+
"largest_contentful_paint": {
|
|
113
|
+
"histogram": [
|
|
114
|
+
{ "start": 0, "end": 2500, "density": 0.72 },
|
|
115
|
+
{ "start": 2500, "end": 4000, "density": 0.18 },
|
|
116
|
+
{ "start": 4000, "density": 0.10 }
|
|
117
|
+
],
|
|
118
|
+
"percentiles": { "p75": 2100 }
|
|
119
|
+
},
|
|
120
|
+
"cumulative_layout_shift": {
|
|
121
|
+
"percentiles": { "p75": "0.05" }
|
|
122
|
+
}
|
|
123
|
+
},
|
|
124
|
+
"collectionPeriod": {
|
|
125
|
+
"firstDate": { "year": 2026, "month": 2, "day": 27 },
|
|
126
|
+
"lastDate": { "year": 2026, "month": 3, "day": 26 }
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### Important
|
|
133
|
+
- **CLS p75 is a string** (e.g., `"0.05"` not `0.05`). Always parse as float from string.
|
|
134
|
+
- Last histogram bin has **no `end`** (extends to infinity).
|
|
135
|
+
- Densities sum to approximately 1.0.
|
|
136
|
+
- **404** = no data (insufficient Chrome traffic). Not an auth error.
|
|
137
|
+
- Updated daily ~04:00 UTC with ~2 day lag.
|
|
138
|
+
|
|
139
|
+
### Rate Limits
|
|
140
|
+
- 150 QPM shared between CrUX and CrUX History APIs
|
|
141
|
+
- Free, no paid increase available
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
## CrUX History API (Weekly)
|
|
146
|
+
|
|
147
|
+
**Endpoint:** `POST https://chromeuxreport.googleapis.com/v1/records:queryHistoryRecord?key={API_KEY}`
|
|
148
|
+
|
|
149
|
+
Same request format as CrUX API. Returns up to **25 weekly collection periods**.
|
|
150
|
+
|
|
151
|
+
### Response Differences from CrUX API
|
|
152
|
+
|
|
153
|
+
Instead of single values, returns timeseries:
|
|
154
|
+
|
|
155
|
+
```json
|
|
156
|
+
{
|
|
157
|
+
"record": {
|
|
158
|
+
"metrics": {
|
|
159
|
+
"largest_contentful_paint": {
|
|
160
|
+
"histogramTimeseries": [
|
|
161
|
+
{ "start": 0, "end": 2500, "densities": [0.70, 0.71, 0.72, ...] },
|
|
162
|
+
{ "start": 2500, "end": 4000, "densities": [0.19, 0.18, 0.18, ...] },
|
|
163
|
+
{ "start": 4000, "densities": [0.11, 0.11, 0.10, ...] }
|
|
164
|
+
],
|
|
165
|
+
"percentilesTimeseries": {
|
|
166
|
+
"p75s": [2200, 2150, 2100, ...]
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
},
|
|
170
|
+
"collectionPeriods": [
|
|
171
|
+
{
|
|
172
|
+
"firstDate": { "year": 2025, "month": 9, "day": 29 },
|
|
173
|
+
"lastDate": { "year": 2025, "month": 10, "day": 26 }
|
|
174
|
+
},
|
|
175
|
+
...
|
|
176
|
+
]
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
### NaN Handling
|
|
182
|
+
- `"NaN"` string for densities in ineligible periods
|
|
183
|
+
- `null` for percentile values in ineligible periods
|
|
184
|
+
- Always check for these before numeric operations
|
|
185
|
+
|
|
186
|
+
### Update Schedule
|
|
187
|
+
- Updated **Mondays** ~04:00 UTC
|
|
188
|
+
- Each period = 28-day rolling average ending on a Sunday
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
## Core Web Vitals Thresholds
|
|
193
|
+
|
|
194
|
+
Current as of March 2026. INP replaced FID on March 12, 2024.
|
|
195
|
+
|
|
196
|
+
| Metric | Good | Needs Improvement | Poor |
|
|
197
|
+
|--------|------|-------------------|------|
|
|
198
|
+
| **LCP** | ≤ 2,500ms | 2,500–4,000ms | > 4,000ms |
|
|
199
|
+
| **INP** | ≤ 200ms | 200–500ms | > 500ms |
|
|
200
|
+
| **CLS** | ≤ 0.1 | 0.1–0.25 | > 0.25 |
|
|
201
|
+
| **FCP** | ≤ 1,800ms | 1,800–3,000ms | > 3,000ms |
|
|
202
|
+
| **TTFB** | ≤ 800ms | 800–1,800ms | > 1,800ms |
|
|
203
|
+
|
|
204
|
+
FID was fully removed from Chrome tools (CrUX, PSI, Lighthouse) on September 9, 2024. Never reference FID in outputs.
|
package/skills/optbrew/modules/seranking-seo/skills/seo-google/references/rate-limits-quotas.md
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# Google API Rate Limits & Quotas
|
|
2
|
+
|
|
3
|
+
## Consolidated Quota Table
|
|
4
|
+
|
|
5
|
+
| API | Per-Minute | Per-Day | Cost | Auth Type | Scope |
|
|
6
|
+
|-----|-----------|---------|------|-----------|-------|
|
|
7
|
+
| GSC Search Analytics | 1,200 QPM/user, 1,200 QPM/site | 30M QPD/project | Free | Service Account | Per user + per site |
|
|
8
|
+
| GSC URL Inspection | 600 QPM/site | 2,000 QPD/site | Free | Service Account | Per site |
|
|
9
|
+
| GSC Sitemaps | Standard | Standard | Free | Service Account | Per site |
|
|
10
|
+
| PageSpeed Insights v5 | 240 QPM | 25,000 QPD | Free | API Key | Per project |
|
|
11
|
+
| CrUX API | 150 QPM (shared) | Unlimited | Free | API Key | Per project |
|
|
12
|
+
| CrUX History API | 150 QPM (shared with CrUX) | Unlimited | Free | API Key | Per project |
|
|
13
|
+
| Indexing API | 380 RPM total, 180 read/min | 200 publish/day | Free | Service Account | Per project |
|
|
14
|
+
| GA4 Data API | 10 concurrent | ~25K tokens/day | Free | Service Account | Per property/project |
|
|
15
|
+
| Knowledge Graph | -- | 100,000 QPD | Free | API Key | Per project |
|
|
16
|
+
| Custom Search | -- | 10,000 QPD max | 100 free, $5/1K | API Key | Per project |
|
|
17
|
+
| Web Risk | 6,000 QPM | 100K/month | Free tier | API Key | Per project |
|
|
18
|
+
|
|
19
|
+
**Key distinction:** "Per site" quotas are scoped to a specific GSC property. "Per project" quotas are shared across all properties in a GCP project. "Per user" quotas are per authenticated user (service account).
|
|
20
|
+
|
|
21
|
+
## Exponential Backoff Strategy
|
|
22
|
+
|
|
23
|
+
When receiving 429 or 5xx errors:
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
Attempt 1: wait 1 second
|
|
27
|
+
Attempt 2: wait 2 seconds
|
|
28
|
+
Attempt 3: wait 4 seconds
|
|
29
|
+
Attempt 4: wait 8 seconds
|
|
30
|
+
Attempt 5: wait 16 seconds
|
|
31
|
+
Max: give up after 5 retries
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Add random jitter (0-500ms) to each wait to avoid thundering herd.
|
|
35
|
+
|
|
36
|
+
## Common Error Codes
|
|
37
|
+
|
|
38
|
+
| Code | Meaning | Applies To | Action |
|
|
39
|
+
|------|---------|------------|--------|
|
|
40
|
+
| 400 | Bad request | All | Check URL format, request body |
|
|
41
|
+
| 401 | Unauthorized | Service Account APIs | Refresh credentials |
|
|
42
|
+
| 403 | Forbidden | GSC, GA4, Indexing | Check permissions (service account access) |
|
|
43
|
+
| 404 | Not found | CrUX, GSC | Insufficient traffic (CrUX) or invalid property (GSC) |
|
|
44
|
+
| 429 | Rate limited | All | Backoff and retry. Check Retry-After header. |
|
|
45
|
+
| 500 | Server error | All | Retry with backoff |
|
|
46
|
+
| 503 | Service unavailable | All | Retry with backoff |
|
|
47
|
+
|
|
48
|
+
## Retry-After Header
|
|
49
|
+
|
|
50
|
+
Some Google APIs return a `Retry-After` header with 429 responses. When present, use this value (in seconds) instead of exponential backoff.
|
|
51
|
+
|
|
52
|
+
## GA4 Token Budgeting
|
|
53
|
+
|
|
54
|
+
GA4 uses a token system rather than simple request counts:
|
|
55
|
+
- Simple 1-dimension, 1-metric report: ~1-5 tokens
|
|
56
|
+
- Complex multi-dimension, multi-metric: ~10-100 tokens
|
|
57
|
+
- Set `returnPropertyQuota: true` to monitor consumption
|
|
58
|
+
- Daily limit: 25,000 tokens per property per project
|
|
59
|
+
- Hourly limit: 5,000 tokens per property per project
|
|
60
|
+
- Concurrent: max 10 simultaneous requests
|
|
61
|
+
|
|
62
|
+
## CrUX Shared Quota
|
|
63
|
+
|
|
64
|
+
The CrUX API and CrUX History API share the same 150 QPM quota per project. Plan accordingly if querying both APIs in the same workflow.
|
|
65
|
+
|
|
66
|
+
## Cost Summary
|
|
67
|
+
|
|
68
|
+
**All APIs used by seo-google are free** at normal usage levels. No billing is required for:
|
|
69
|
+
- PSI, CrUX, CrUX History (API key, unlimited free)
|
|
70
|
+
- GSC (service account, 30M QPD)
|
|
71
|
+
- Indexing API (service account, 200 publish/day)
|
|
72
|
+
- GA4 Data API (service account, 25K tokens/day)
|
|
73
|
+
- Knowledge Graph (API key, 100K QPD)
|
|
74
|
+
|
|
75
|
+
Only Custom Search and Web Risk have paid tiers at high volumes.
|
package/skills/optbrew/modules/seranking-seo/skills/seo-google/references/search-console-api.md
ADDED
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
# Google Search Console API Reference
|
|
2
|
+
|
|
3
|
+
## Table of Contents
|
|
4
|
+
1. [Search Analytics API](#search-analytics-api)
|
|
5
|
+
2. [URL Inspection API](#url-inspection-api)
|
|
6
|
+
3. [Sitemaps API](#sitemaps-api)
|
|
7
|
+
4. [Sites API](#sites-api)
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Search Analytics API
|
|
12
|
+
|
|
13
|
+
**Endpoint:** `POST https://www.googleapis.com/webmasters/v3/sites/{siteUrl}/searchAnalytics/query`
|
|
14
|
+
|
|
15
|
+
### Request Body
|
|
16
|
+
|
|
17
|
+
| Field | Type | Description |
|
|
18
|
+
|-------|------|-------------|
|
|
19
|
+
| `startDate` | string | Required. YYYY-MM-DD format. |
|
|
20
|
+
| `endDate` | string | Required. YYYY-MM-DD format. |
|
|
21
|
+
| `dimensions` | string[] | `query`, `page`, `country`, `device`, `date`, `searchAppearance` |
|
|
22
|
+
| `type` | string | `web` (default), `image`, `video`, `news`, `discover`, `googleNews` |
|
|
23
|
+
| `dimensionFilterGroups` | object[] | Array of filter groups (see below) |
|
|
24
|
+
| `aggregationType` | string | `auto` (default), `byPage`, `byProperty`, `byNewsShowcasePanel` |
|
|
25
|
+
| `rowLimit` | int | 1-25000 (default: 1000) |
|
|
26
|
+
| `startRow` | int | Pagination offset (default: 0) |
|
|
27
|
+
| `dataState` | string | `final` (default), `all`, `hourly_all` |
|
|
28
|
+
|
|
29
|
+
### Dimension Filters
|
|
30
|
+
|
|
31
|
+
```json
|
|
32
|
+
{
|
|
33
|
+
"dimensionFilterGroups": [{
|
|
34
|
+
"filters": [{
|
|
35
|
+
"dimension": "query",
|
|
36
|
+
"operator": "contains",
|
|
37
|
+
"expression": "seo"
|
|
38
|
+
}]
|
|
39
|
+
}]
|
|
40
|
+
}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
**Operators:** `contains`, `equals`, `notContains`, `notEquals`, `includingRegex`, `excludingRegex`
|
|
44
|
+
- Regex uses RE2 syntax, max 4096 characters
|
|
45
|
+
|
|
46
|
+
### Response
|
|
47
|
+
|
|
48
|
+
```json
|
|
49
|
+
{
|
|
50
|
+
"rows": [
|
|
51
|
+
{
|
|
52
|
+
"keys": ["seo tools", "https://example.com/tools"],
|
|
53
|
+
"clicks": 150,
|
|
54
|
+
"impressions": 5000,
|
|
55
|
+
"ctr": 0.03,
|
|
56
|
+
"position": 4.2
|
|
57
|
+
}
|
|
58
|
+
],
|
|
59
|
+
"responseAggregationType": "byPage"
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### Important Notes
|
|
64
|
+
- Data has a **2-3 day lag**. Available for approximately 16 months.
|
|
65
|
+
- `discover` and `googleNews` types do not support `query` dimension or `position` metric.
|
|
66
|
+
- Country codes are **ISO 3166-1 alpha-3** (e.g., `USA`, `GBR`, `DEU`).
|
|
67
|
+
- Pagination: increment `startRow` by `rowLimit` until fewer rows returned.
|
|
68
|
+
|
|
69
|
+
### Rate Limits
|
|
70
|
+
- 1,200 QPM per user
|
|
71
|
+
- 1,200 QPM per site
|
|
72
|
+
- 40,000 QPM / 30,000,000 QPD per project
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## URL Inspection API
|
|
77
|
+
|
|
78
|
+
**Endpoint:** `POST https://searchconsole.googleapis.com/v1/urlInspection/index:inspect`
|
|
79
|
+
|
|
80
|
+
### Request
|
|
81
|
+
|
|
82
|
+
```json
|
|
83
|
+
{
|
|
84
|
+
"inspectionUrl": "https://example.com/page",
|
|
85
|
+
"siteUrl": "sc-domain:example.com",
|
|
86
|
+
"languageCode": "en"
|
|
87
|
+
}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### Response Fields
|
|
91
|
+
|
|
92
|
+
**`indexStatusResult`:**
|
|
93
|
+
|
|
94
|
+
| Field | Values |
|
|
95
|
+
|-------|--------|
|
|
96
|
+
| `verdict` | `PASS`, `FAIL`, `NEUTRAL`, `PARTIAL`, `VERDICT_UNSPECIFIED` |
|
|
97
|
+
| `coverageState` | Human-readable coverage description |
|
|
98
|
+
| `robotsTxtState` | `ALLOWED`, `DISALLOWED` |
|
|
99
|
+
| `indexingState` | `INDEXING_ALLOWED`, `BLOCKED_BY_META_TAG`, `BLOCKED_BY_HTTP_HEADER` |
|
|
100
|
+
| `pageFetchState` | `SUCCESSFUL`, `SOFT_404`, `BLOCKED_ROBOTS_TXT`, `NOT_FOUND`, `ACCESS_DENIED`, `SERVER_ERROR`, `REDIRECT_ERROR`, `ACCESS_FORBIDDEN`, `BLOCKED_4XX`, `INTERNAL_CRAWL_ERROR`, `INVALID_URL` |
|
|
101
|
+
| `lastCrawlTime` | ISO 8601 timestamp |
|
|
102
|
+
| `googleCanonical` | URL Google selected as canonical |
|
|
103
|
+
| `userCanonical` | URL declared canonical by the page |
|
|
104
|
+
| `crawledAs` | `DESKTOP`, `MOBILE` |
|
|
105
|
+
|
|
106
|
+
**`richResultsResult`:** Verdict + detected rich result types (FAQPage, HowTo, etc.)
|
|
107
|
+
|
|
108
|
+
### Rate Limits
|
|
109
|
+
- 2,000 QPD / 600 QPM per site
|
|
110
|
+
- 10,000,000 QPD / 15,000 QPM per project
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## Sitemaps API
|
|
115
|
+
|
|
116
|
+
**Base:** `https://www.googleapis.com/webmasters/v3/sites/{siteUrl}/sitemaps`
|
|
117
|
+
|
|
118
|
+
| Method | Endpoint | Description |
|
|
119
|
+
|--------|----------|-------------|
|
|
120
|
+
| `GET` | `/sitemaps` | List all sitemaps |
|
|
121
|
+
| `GET` | `/sitemaps/{feedpath}` | Get specific sitemap |
|
|
122
|
+
| `PUT` | `/sitemaps/{feedpath}` | Submit a sitemap |
|
|
123
|
+
| `DELETE` | `/sitemaps/{feedpath}` | Delete a sitemap |
|
|
124
|
+
|
|
125
|
+
### Sitemap Resource
|
|
126
|
+
|
|
127
|
+
| Field | Description |
|
|
128
|
+
|-------|-------------|
|
|
129
|
+
| `path` | URL of the sitemap |
|
|
130
|
+
| `lastSubmitted` | Last submission timestamp |
|
|
131
|
+
| `isPending` | Whether processing is incomplete |
|
|
132
|
+
| `isSitemapsIndex` | Whether this is a sitemap index |
|
|
133
|
+
| `type` | `sitemap`, `atomFeed`, `rssFeed`, `urlList`, `notSitemap` |
|
|
134
|
+
| `warnings` | Warning count |
|
|
135
|
+
| `errors` | Error count |
|
|
136
|
+
| `contents[]` | Array with `type` (web, image, video, news) and `submitted` count |
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## Sites API
|
|
141
|
+
|
|
142
|
+
**Base:** `https://www.googleapis.com/webmasters/v3/sites`
|
|
143
|
+
|
|
144
|
+
| Method | Endpoint | Description |
|
|
145
|
+
|--------|----------|-------------|
|
|
146
|
+
| `GET` | `/sites` | List all verified properties |
|
|
147
|
+
| `GET` | `/sites/{siteUrl}` | Get property info |
|
|
148
|
+
| `PUT` | `/sites/{siteUrl}` | Add a property |
|
|
149
|
+
| `DELETE` | `/sites/{siteUrl}` | Remove a property |
|
|
150
|
+
|
|
151
|
+
### Property Resource
|
|
152
|
+
|
|
153
|
+
| Field | Values |
|
|
154
|
+
|-------|--------|
|
|
155
|
+
| `siteUrl` | Property URL (e.g., `sc-domain:example.com`) |
|
|
156
|
+
| `permissionLevel` | `siteOwner`, `siteFullUser`, `siteRestrictedUser`, `siteUnverifiedUser` |
|
package/skills/optbrew/modules/seranking-seo/skills/seo-google/references/supplementary-apis.md
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# Supplementary Google APIs for SEO
|
|
2
|
+
|
|
3
|
+
## Knowledge Graph Search API
|
|
4
|
+
|
|
5
|
+
Verify brand/entity presence in Google's Knowledge Graph.
|
|
6
|
+
|
|
7
|
+
**Endpoint:** `GET https://kgsearch.googleapis.com/v1/entities:search`
|
|
8
|
+
|
|
9
|
+
| Param | Description |
|
|
10
|
+
|-------|-------------|
|
|
11
|
+
| `query` | Search query |
|
|
12
|
+
| `ids` | Specific entity IDs (e.g., `/m/0d6lp`) |
|
|
13
|
+
| `languages` | Language codes (e.g., `en`) |
|
|
14
|
+
| `types` | Schema.org types to filter (e.g., `Organization`, `Person`) |
|
|
15
|
+
| `limit` | Max results (1-500) |
|
|
16
|
+
| `key` | API key (required) |
|
|
17
|
+
|
|
18
|
+
**Response:**
|
|
19
|
+
```json
|
|
20
|
+
{
|
|
21
|
+
"itemListElement": [{
|
|
22
|
+
"result": {
|
|
23
|
+
"@id": "kg:/m/0d6lp",
|
|
24
|
+
"name": "Google",
|
|
25
|
+
"@type": ["Organization", "Corporation"],
|
|
26
|
+
"description": "Technology company",
|
|
27
|
+
"detailedDescription": {
|
|
28
|
+
"articleBody": "Google LLC is an American...",
|
|
29
|
+
"url": "https://en.wikipedia.org/wiki/Google"
|
|
30
|
+
},
|
|
31
|
+
"image": { "url": "..." },
|
|
32
|
+
"url": "https://www.google.com"
|
|
33
|
+
},
|
|
34
|
+
"resultScore": 4892.5
|
|
35
|
+
}]
|
|
36
|
+
}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
**Use for SEO:** Verify if a brand has a Knowledge Panel, check entity disambiguation, find related entities.
|
|
40
|
+
|
|
41
|
+
**Quota:** 100,000 reads/day. Free. API key only.
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## Custom Search JSON API
|
|
46
|
+
|
|
47
|
+
Programmatic Google search results (limited).
|
|
48
|
+
|
|
49
|
+
**Endpoint:** `GET https://customsearch.googleapis.com/customsearch/v1`
|
|
50
|
+
|
|
51
|
+
| Param | Description |
|
|
52
|
+
|-------|-------------|
|
|
53
|
+
| `key` | API key (required) |
|
|
54
|
+
| `cx` | Programmable Search Engine ID (required) |
|
|
55
|
+
| `q` | Search query |
|
|
56
|
+
| `num` | Results per page (1-10) |
|
|
57
|
+
| `start` | Start index (max 91) |
|
|
58
|
+
| `dateRestrict` | Date restriction (e.g., `d30` for 30 days) |
|
|
59
|
+
| `gl` | Country (e.g., `us`) |
|
|
60
|
+
| `lr` | Language restriction |
|
|
61
|
+
| `searchType` | `image` for image search |
|
|
62
|
+
| `siteSearch` | Restrict to a domain |
|
|
63
|
+
|
|
64
|
+
**Limitations:**
|
|
65
|
+
- Max 100 total results per query (10 pages x 10 results)
|
|
66
|
+
- **CLOSED to new customers as of 2025.** Existing customers must migrate by January 2027.
|
|
67
|
+
- 100 queries/day free, $5 per 1,000 up to 10,000/day
|
|
68
|
+
|
|
69
|
+
**For SERP data, prefer DataForSEO** (`/seo dataforseo serp`) which has no such limitations.
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## Web Risk API
|
|
74
|
+
|
|
75
|
+
Check if URLs are flagged as unsafe by Google Safe Browsing.
|
|
76
|
+
|
|
77
|
+
**Endpoint:** `GET https://webrisk.googleapis.com/v1/uris:search`
|
|
78
|
+
|
|
79
|
+
| Param | Description |
|
|
80
|
+
|-------|-------------|
|
|
81
|
+
| `threatTypes` | `MALWARE`, `SOCIAL_ENGINEERING`, `UNWANTED_SOFTWARE`, `SOCIAL_ENGINEERING_EXTENDED_COVERAGE` |
|
|
82
|
+
| `uri` | URL to check |
|
|
83
|
+
| `key` | API key (required) |
|
|
84
|
+
|
|
85
|
+
**Response (clean URL):** Empty threat object.
|
|
86
|
+
|
|
87
|
+
**Response (flagged URL):**
|
|
88
|
+
```json
|
|
89
|
+
{
|
|
90
|
+
"threat": {
|
|
91
|
+
"threatTypes": ["MALWARE"],
|
|
92
|
+
"expireTime": "2026-04-01T00:00:00Z"
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
**Use for SEO:** Check if pages are flagged (could explain deindexing), verify competitor safety, audit outbound links.
|
|
98
|
+
|
|
99
|
+
**Quota:** 6,000 QPM. 100,000/month free tier. Requires billing enabled on GCP project.
|