Keyword Analysis API MCP Server
API phân tích từ khóa ưu tiên tác nhân cho nghiên cứu SERP trực tiếp, thu thập trang và tổng hợp từ khóa SEO.
Tài liệu
keyword-analysis-api
Agent-first keyword analysis API for live SERP research, page scraping, and keyword synthesis.
Summary
This service is designed for LLMs and MCP-style agents that need to:
- create an account without a traditional website flow
- verify ownership of an email with a one-time code
- run live keyword analysis against Google results
- receive structured SEO-oriented output focused on word count and keyword density
- defer billing setup until after free usage is exhausted
The product is mostly headless. Human interaction is only required for:
- reading the email verification code
- completing hosted Stripe billing setup when free usage is exhausted
Authentication Flow
POST /auth/create-accountCreate or resume a pending account for an email address.POST /auth/verify-accountSubmit the one-time code sent by email. On success this returns an API token.- Use the API token as either:
Authorization: Bearer <token>X-API-Key: <token>
MCP Connector
- MCP endpoint:
GET/POST /mcp - OAuth metadata:
GET /.well-known/oauth-authorization-server - OAuth authorize:
GET /oauth/authorize - OAuth token exchange:
POST /oauth/token - Dynamic client registration:
POST /oauth/register
The MCP server exposes tool wrappers for:
- account status
- usage summary
- queued keyword analysis
- job lookup and listing
- billing setup
Primary Endpoint
POST /keyword-analysis/analyze
Queue a keyword analysis job that will:
- fetch live SERP results from Bright Data
- scrape the top results with Jina Reader
- calculate suggested target word count
- score primary and supporting keyword candidates from the ranking-page corpus
- recommend the closest ranking-backed primary keyword for the user's original query
- use a constrained LLM cleanup pass to choose the strongest supporting keywords from those candidates
- calculate primary and secondary keyword density targets from the ranking-page corpus
Input
{
"keyword": "ai teaching assistant",
"top_n_results": 5,
"include_page_content": false
}
Output
Returns:
keywordsuggested_word_counttotal_results_analyzedresultsanalysis.primary_keywordanalysis.primary_keyword_densityanalysis.secondary_keywords
Notes:
keywordis the user's original queryanalysis.primary_keywordis the recommended ranking-backed primary keyword targetresultscontains only the pages actually used in the analysis and each item includesanalysis_rank
OpenAPI Summary
Auth
POST /auth/create-accountPOST /auth/verify-accountGET /auth/account-statusGET /auth/usage-summary
Billing
POST /billing/start-billing-setupPOST /billing/stripe/webhooksGET /billing/setup/successGET /billing/setup/cancel
Keyword Analysis
POST /keyword-analysis/analyze
Discovery
GET /GET /mcpGET /.well-known/oauth-authorization-serverGET /llms.txtGET /.well-known/llms.txtGET /openapi.json
Account and Billing Endpoints
GET /auth/account-status
Get verified status, billing status, and free-search availability.
GET /auth/usage-summary
Get free usage, paid usage, successful searches, and failed searches.
POST /billing/start-billing-setup
Return a hosted Stripe URL for payment-method setup or billing management.
POST /billing/stripe/webhooks
Stripe webhook endpoint for billing state updates.
Example Flows
1. Create Account
Request:
{
"email": "[email protected]"
}
Response:
{
"pending_user_id": "pending_abcd1234",
"verification_required": true,
"expires_in_seconds": 600,
"delivery_method": "smtp"
}
In development, delivery_method may be console and verification_code may be included directly.
2. Verify Account
Request:
{
"pending_user_id": "pending_abcd1234",
"code": "123456"
}
Response:
{
"account_id": 1,
"email": "[email protected]",
"api_token": "kaa_xxxxx",
"billing_status": "unconfigured",
"free_searches_remaining": 25
}
3. Check Account Status
Response:
{
"account_id": 1,
"email": "[email protected]",
"email_verified": true,
"billing_configured": false,
"billing_status": "unconfigured",
"free_searches_remaining": 25,
"paid_usage_enabled": false,
"usage_this_month": 0
}
4. Run Keyword Analysis
Request:
Response shape:
{ "keyword": "auto body repair pearland tx", "suggested_word_count": 550, "total_results_analyzed": 4, "results": [ { "analysis_rank": 1, "title": "Collision Repair in Pearland", "url": "https://example.com/pearland-collision-repair", "rank": 1, "word_count": 612, "scrape_error": null } ], "analysis": { "primary_keyword": "collision repair pearland", "primary_keyword_density": { "keyword": "collision repair pearland", "occurrence_count": 4, "occurrences_per_result": 1.0, "total_word_count": 2287, "density_percentage": 0.17 }, "secondary_keywords": [ { "keyword": "collision repair", "occurrence_count": 13, "occurrences_per_result": 3.25, "total_word_count": 2287, "density_percentage": 0.57 } ] } }
### 5\. Start Billing Setup
Response:
{ "billing_status": "unconfigured", "url": "https://checkout.stripe.com/...", "mode": "checkout_setup", "stripe_customer_id": "cus_123" }
## Billing-Required Response Pattern
When free usage is exhausted and billing is not configured, the API may return HTTP `402` with a detail object like:
{ "message": "Billing setup required", "billing_url": "https://checkout.stripe.com/..." }
## Billing Model
* First 25 successful searches are free
* Billing is only required after free usage is exhausted
* Failed searches should not be billed
* Successful searches are metered per completed keyword-analysis request
## Agent Guidance
* If account creation returns a verification code in development, use it directly
* In production, ask the human to check email for the code
* If analysis returns a billing-required response, show the hosted billing URL to the user
* Prefer `top_n_results=5` unless a larger competitive sample is necessary
* Use `include_page_content=false` by default to minimize payload size
## Best Practices For Agents
* Treat `create-account` and `verify-account` as a two-step handshake
* Do not retry verification blindly after a wrong code; ask the user to re-check email
* Store the returned API token securely for future calls
* On HTTP `402`, pause analysis flow and present the hosted billing URL to the human
* Retry transient upstream failures conservatively; avoid repeated search bursts
* Do not assume every SERP request will return the same ranking set across time and geography
* Treat `analysis.primary_keyword` as the recommended target and `keyword` as the user's original query
* Use `account-status` before prompting the user for billing if you are unsure whether free usage remains
* Consider `usage-summary` the source of truth for agent-side quota messaging
* Default to 5 results for speed and cost unless the user explicitly asks for deeper analysis
* If partial scraping occurs but a valid analysis returns, treat the request as successful unless the API says otherwise
## Discovery Endpoints
* `GET /`
* `GET /llms.txt`
* `GET /.well-known/llms.txt`
* `GET /openapi.json`
## Notes
* This service is optimized for fast, structured keyword analysis rather than broad SEO suite workflows
* It is intended to be easier and cheaper to use than a full SEO platform when the only need is quick live keyword research