Keyword Analysis API
Agent-first Keyword-Analyse-API für Live-SERP-Recherche, Seiten-Scraping und SEO-Keyword-Synthese.
Dokumentation
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": "user@example.com"
}
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": "user@example.com",
"api_token": "kaa_xxxxx",
"billing_status": "unconfigured",
"free_searches_remaining": 25
}
3. Check Account Status
Response:
{
"account_id": 1,
"email": "user@example.com",
"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:
{
"keyword": "ai teaching assistant",
"top_n_results": 5,
"include_page_content": false
}
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=5unless a larger competitive sample is necessary - Use
include_page_content=falseby default to minimize payload size
Best Practices For Agents
- Treat
create-accountandverify-accountas 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_keywordas the recommended target andkeywordas the user's original query - Use
account-statusbefore prompting the user for billing if you are unsure whether free usage remains - Consider
usage-summarythe 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.txtGET /.well-known/llms.txtGET /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