Keyword researchGET$0.06
/v1/keyword-research
One seed, the whole picture: keywords and questions from autocomplete and the paid index, with volume, CPC, difficulty and intent attached.
The other three keyword calls are components — useful when an agent is deciding exactly what to pay for. This is the one to call when you want an answer. It runs public autocomplete and the paid keyword index together, merges them, prices the terms autocomplete found that the index did not, and splits the result into keywords and questions.
Each row carries `sources`: `index` means the paid keyword index knows it, `autocomplete` means people are typing it, and both is the strongest signal you can get for a term. Rows the index has never priced come back with null metrics rather than being dropped.
At $0.06 it costs less than keyword-ideas ($0.05) plus keyword-metrics ($0.03) bought separately, and it includes the autocomplete pass for free.
Parameters#
| Name | Description | |
|---|---|---|
seed | required | keyword to research (1–80 chars) |
country | optional | 2-letter country code, default us |
lang | optional | 2-letter language code, default en |
limit | optional | rows per list, 1–200 (default 100) |
Request#
Plain GET. Without a payment header the response is a 402 carrying the price; an x402 client pays and retries on its own — see the quickstart.
GET https://citable.run/v1/keyword-research?seed=reksadana&country=id&lang=id
Response#
200 with the JSON below (trimmed) and the settlement signature in the PAYMENT-RESPONSE header. Every paid response also carries price and cluster.
{
"seed": "reksadana",
"country": "id",
"lang": "id",
"keywords": [
{ "keyword": "reksadana", "volume": 74000, "cpc": 0.18, "competition": "low", "difficulty": 41, "intent": "informational", "sources": ["index", "autocomplete"], "isQuestion": false },
{ "keyword": "reksadana pasar uang", "volume": 27100, "cpc": 0.22, "competition": "low", "difficulty": 33, "intent": "informational", "sources": ["index"], "isQuestion": false },
{ "keyword": "reksadana bibit", "volume": 12100, "cpc": null, "competition": null, "difficulty": 28, "intent": "commercial", "sources": ["index", "autocomplete"], "isQuestion": false }
],
"questions": [
{ "keyword": "apa itu reksadana", "volume": 8100, "cpc": 0.11, "competition": "low", "difficulty": 22, "intent": "informational", "sources": ["index", "autocomplete"], "isQuestion": true },
{ "keyword": "bagaimana cara beli reksadana", "volume": 1300, "cpc": null, "competition": null, "difficulty": null, "intent": null, "sources": ["autocomplete"], "isQuestion": true }
],
"summary": { "total": 128, "withVolume": 104, "questions": 23, "totalFoundForSeed": 1840 },
"sources": { "index": true, "autocomplete": true },
"price": "$0.06",
"cluster": "mainnet"
}Errors#
Any non-200 cancels the payment — errors are free.
| Status | Code | When |
|---|---|---|
| 400 | invalid_seed | seed missing or longer than 80 chars |
| 400 | invalid_locale | country or lang is not a 2-letter code |
| 502 | upstream_failed | the data source did not answer — nothing is charged |
| 503 | not_configured | this deployment has no credentials for the source — nothing is charged |
MCP tool#
The same call from Claude, Codex or Cursor once citable-mcp is installed. Arguments mirror the parameters above.
citable_keyword_research(seed, country?, lang?, limit?) $0.06Source & latency#
| Data source | Typical latency |
|---|---|
| Public autocomplete (in-house) + DataForSEO Labs | ~4–8 s |
Note