How to Use OpenSEO to Identify Organic Search Opportunities: A Complete Guide
OpenSEO identifies organic search opportunities by merging Google Search Console impressions, Google Analytics 4 organic sessions, and DataForSEO Labs keyword data into a ranked list of high-volume, low-competition keywords.
OpenSEO is a self-hosted SEO platform that surfaces actionable search opportunities through its MCP (Multi-Channel Provider) Tools architecture. The system correlates your existing organic performance data with third-party keyword metrics to find untapped ranking potential. This guide walks through the complete workflow, implementation details, and four ways to invoke the analysis.
How OpenSEO's Search Opportunity Pipeline Works
The platform follows a six-stage pipeline to transform raw data into prioritized keyword recommendations:
| Step | Component | Source Location |
|---|---|---|
| 1 | Request ingestion via CLI, API, or Web UI | web/src/routes/api/… |
| 2 | MCP tool dispatches to get_search_opportunities |
src/server/mcp/tools/google-analytics-tools.ts |
| 3 | DataForSEO Labs API call with location validation | src/server/mcp/tools/dataforseo-research-tools.ts |
| 4 | Credit consumption and 7-day result caching | src/shared/billing.ts |
| 5 | Aggregation of GSC, GA, and keyword metrics | src/server/features/sam/samChatTools.ts |
| 6 | Table presentation with opportunity scoring | web/content/docs/mcp.md |
The opportunity score is computed as a heuristic combining high search volume, low keyword difficulty, and evidence of existing organic traction. This surfaces keywords where you already have some presence but could capture significantly more traffic with targeted optimization.
Prerequisites: Data Sources for Organic Search Opportunities
To generate meaningful results, your OpenSEO project must have three integrations configured:
-
Google Search Console — provides impression data showing which queries already trigger your site in search results. See
docs/SELF_HOSTING_GOOGLE_SEARCH_CONSOLE.mdfor setup instructions. -
Google Analytics 4 — supplies "organic" session counts to validate which keywords drive actual visits. Configuration details are in
docs/SELF_HOSTING_GOOGLE_ANALYTICS.md. -
DataForSEO API key — enables keyword-level volume, CPC, and difficulty metrics. Self-hosted deployments pass costs directly through using the
DATAFORSEO_API_KEYenvironment variable (gated insrc/shared/selfhost-checks.ts).
All DataForSEO calls require ISO 3166-1 alpha-2 country codes and language codes. The canonical mapping lives in src/shared/keyword-locations.ts with the isSupportedLocationCode validator.
Method 1: CLI Command for Search Opportunities
The built-in openseo CLI provides the fastest entry point for one-off analyses. The command forwards to the MCP tool registration in src/server/mcp/tools/google-analytics-tools.ts.
# List projects to locate your project ID
openseo list-projects
# Run the organic search opportunity analysis
openseo get-search-opportunities \
--projectId <project-id> \
--keywords "organic coffee, sustainable tea, fair-trade chocolate"
The CLI automatically handles authentication and project resolution before invoking the DataForSEO pipeline.
Method 2: Direct HTTP API Call
For automation or custom integrations, POST directly to the MCP tools endpoint at line 357 of src/server/mcp/tools/google-analytics-tools.ts:
curl -X POST https://<your-openseo-host>/api/mcp/tools/get_search_opportunities \
-H "Authorization: Bearer <your-token>" \
-H "Content-Type: application/json" \
-d '{
"projectId": "<project-id>",
"keywords": ["organic coffee","sustainable tea","fair-trade chocolate"]
}'
This returns the aggregated opportunity data immediately. The backend merges GA organic sessions with DataForSEO metrics before responding.
Method 3: Web UI Dashboard
The MCP Dashboard provides visual exploration of search opportunities:
- Navigate to MCP → Search Opportunities
- Select your project and enter comma-separated seed keywords
- Click Run to execute the analysis
The results table displays: Keyword, Avg Vol, CPC, Difficulty, GA Organic Sessions, and computed Opportunity Score. Columns are populated by the aggregation logic in src/server/features/sam/samChatTools.ts.
Method 4: Programmatic Node.js/TypeScript Access
The @openseo/mcp-client package wraps HTTP calls into typed methods:
import { createMcpClient } from '@openseo/mcp-client';
const client = createMcpClient({
baseUrl: 'https://<your-openseo-host>',
token: '<your-token>',
});
const result = await client.callTool('get_search_opportunities', {
projectId: '<project-id>',
keywords: ['organic coffee', 'sustainable tea', 'fair-trade chocolate'],
});
console.log(result);
// → Array of opportunity objects with scoring metadata
This matches the exact API surface used by the CLI and web UI, ensuring consistent results across all interfaces.
Understanding the Response: Search Opportunity Data Structure
Each opportunity object follows this schema:
[
{
"keyword": "organic coffee",
"searchVolume": 6200,
"cpcUsd": 1.45,
"difficulty": 32,
"gaOrganicSessions": 340,
"gscImpressions": 1120,
"opportunityScore": 0.78
}
]
- searchVolume — monthly average from DataForSEO Labs
- cpcUsd — cost-per-click indicating commercial intent
- difficulty — 0-100 ranking difficulty estimate
- gaOrganicSessions — your verified organic traffic for this keyword
- gscImpressions — how often Google displayed your site for this query
- opportunityScore — composite ranking (higher = better investment target)
Keywords with high opportunityScore values represent existing organic traction plus expandable volume — the ideal candidates for content updates or new page creation.
Cost Optimization: Task Queues and Caching
OpenSEO implements two cost-control mechanisms from src/shared/rank-tracking.ts:
-
Task queues — For "live" SERP requests, DataForSEO's task queue reduces costs to approximately 30% of standard live pricing while respecting rate limits.
-
7-day caching — DataForSEO lookups including Google Business categories are cached in
src/server/mcp/tools/local-seo-tools.ts. Repeated opportunity analyses for the same keywords return cached results without consuming additional credits.
Self-hosted deployments pay DataForSEO directly with no markup. The src/shared/billing.ts module tracks usage for hosted instances, preventing balance depletion through pre-call credit checks.
Location and Language Code Requirements
Every DataForSEO call requires validated location parameters. The helper src/shared/keyword-locations.ts enforces supported combinations:
// Valid call example
{
"location_code": 2840, // United States
"language_code": "en" // English
}
Invalid codes return validation errors before API calls consume credits. The mapping supports 50+ countries with their primary languages.
Summary
-
OpenSEO identifies organic search opportunities by correlating GSC impressions, GA4 organic sessions, and DataForSEO keyword metrics through the
get_search_opportunitiesMCP tool. -
Four invocation methods are available: CLI (
openseo get-search-opportunities), HTTP API (/api/mcp/tools/get_search_opportunities), Web UI dashboard, and programmatic TypeScript client. -
Key source files include
google-analytics-tools.ts(tool definition),dataforseo-research-tools.ts(API wrapper),keyword-locations.ts(validation), andsamChatTools.ts(scoring logic). -
Cost efficiency comes from 7-day caching and optional task queues for live SERP data.
-
Prerequisites are GSC property connection, GA4 organic tracking, and valid DataForSEO API credentials.
Frequently Asked Questions
What data sources does OpenSEO require for search opportunity analysis?
OpenSEO requires Google Search Console for impression data, Google Analytics 4 for organic session validation, and DataForSEO Labs for keyword volume, CPC, and difficulty metrics. All three must be configured before the get_search_opportunities tool returns complete results. GSC and GA setup guides are in docs/SELF_HOSTING_GOOGLE_SEARCH_CONSOLE.md and docs/SELF_HOSTING_GOOGLE_ANALYTICS.md.
How does OpenSEO calculate the opportunity score?
The opportunity score is a heuristic computed in src/server/features/sam/samChatTools.ts that weights high search volume, low keyword difficulty, and existing organic traffic evidence. Keywords already generating GA sessions and GSC impressions but with untapped volume potential receive the highest scores. The 0-1 normalized output enables direct priority ranking.
What are the costs for running search opportunity analyses?
Self-hosted OpenSEO deployments pay DataForSEO directly at their published API rates with no platform markup. Hosted instances use an internal credit system defined in src/shared/billing.ts that converts raw USD costs. Results are cached for 7 days in src/server/mcp/tools/local-seo-tools.ts, preventing duplicate charges for repeated keyword lookups. Live SERP requests can use task queues at approximately 30% of standard costs.
Can I use OpenSEO search opportunities without connecting Google Analytics?
You can invoke get_search_opportunities without GA connection, but the returned data will lack the gaOrganicSessions field. This severely degrades the opportunity score accuracy, as the system cannot distinguish between keywords with proven traffic performance versus speculative targets. Full value requires all three data sources.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →