# Keyword Search Volume & CPC (Bulk)

> Keyword Search Volume & CPC (Bulk) is a paid API for AI agents from keywords.duoleads.com, paid per call via x402, $0.04/call, status unknown (last checked 2026-10-21).

Returns search volume, CPC, competition, keyword difficulty, and search intent for up to 100 keywords in a single call using Google Ads data via DataForSEO Labs.

## Facts

- Endpoint: POST https://keywords.duoleads.com/v1/keyword-overview?utm_source=zero.xyz
- Price: $0.04/call
- Payment: x402
- Status: unknown
- Last checked: 2026-10-21
- Activations on Zero: 0
- Tags: x402
- Canonical page: https://www.zero.xyz/c/keyword-search-volume-cpc-bulk-e88c0cb2
- Structured record (JSON): https://api.zero.xyz/v1/capabilities/cap_X10HxiRne0TIgQw1PKkzG

Status and success rate cover calls made through Zero and Zero's own probes. Third-party monitors may report differently.

## How to call it through Zero

Zero handles the 402 payment challenge and records the run. With the Zero CLI installed (`npm i -g @zeroxyz/cli`):

```sh
zero fetch --capability keyword-search-volume-cpc-bulk-e88c0cb2 -d '<json body>'
```

Example prompt: Can you pull search volume, CPC, competition, and keyword difficulty for these 10 keywords — 'project management software', 'crm tools', 'email marketing', 'seo tools', 'landing page builder', 'live chat software', 'help desk software', 'invoicing app', 'time tracking', 'payroll software' — for the US market in English?

## When to prefer this

Use this endpoint when you already have a list of 2–100 keywords and need to prioritize or enrich them with authoritative Google Ads-sourced metrics in a single cost-efficient call ($0.04). It is preferable over the GET /search-volume sibling endpoint when processing more than 20 keywords at once. Ideal for bulk SEO audits, content calendar prioritization, PPC keyword triage, and niche research workflows where you need volume, intent, difficulty, and CPC in one shot.

## Known failure modes

- Keywords that are empty, over 10 words, or over 80 characters after normalization are placed in 'missing' (not charged)
- Keywords with no data from DataForSEO are omitted from results and listed in 'missing' (still charged)
- Invalid country name or unsupported location code triggers a fallback to US (2840) with market.fallback=true and a warning
- Upstream DataForSEO errors may result in a non-200 response but are not charged
- Request with no valid keywords after normalization returns a free 400 error
- Unsupported language for a location falls back to the location's default language with a warning in market.warnings

## How this service works

Search volume, CPC, competition, keyword difficulty and search intent for up to 100 keywords in one $0.04 call (Google Ads data via DataForSEO Labs). Use when you already have a keyword list to prioritise. volume = avg monthly searches, cpc in USD, competition 0-1, difficulty 0-100. Keywords without data are left out of results and listed in missing (still charged). Bad input is free; upstream errors are not charged.

## Output

A JSON response containing per-keyword data including average monthly search volume, CPC in USD, competition score (0–1), competition level (LOW/MEDIUM/HIGH), keyword difficulty (0–100), search intent (informational/navigational/commercial/transactional), and year-over-year trend percentage. Also includes market context (country, language, location code), data freshness timestamp, a list of any keywords with no data (missing), and optionally month-by-month search volume arrays if includeMonthly is true.

## Request schema (JSON Schema)

```json
{
 "type": "object",
 "properties": {
  "country": {
   "type": "string",
   "description": "Optional ISO 3166-1 alpha-2 code or country name, used when locationCode is absent (uk = gb)."
  },
  "keywords": {
   "type": "array",
   "items": {
    "type": "string",
    "maxLength": 80,
    "minLength": 1
   },
   "maxItems": 100,
   "minItems": 1,
   "description": "Keywords to look up (1-100; each at most 80 characters). Whitespace and control characters are normalised to single spaces and keywords to lower case; a keyword that is then empty, over 10 words or over 80 characters is not looked up and is listed in missing, and a request with no keyword left to look up is a free 400 (the one exception to openverbs schema compatibility)."
  },
  "languageCode": {
   "type": "string",
   "description": "Language code (2-letter). Defaults to en. An unsupported location falls back to 2840 (United States) with en (or the requested language if the United States offers it); a supported location with a language it does not offer uses that location's default language (en if offered). Either way market.fallback is true and market.warnings says what was used."
  },
  "locationCode": {
   "type": "integer",
   "description": "DataForSEO location code. Defaults to 2840 (United States); an unsupported code falls back to 2840 (United States, market.fallback)."
  },
  "includeMonthly": {
   "type": "boolean",
   "description": "Add each keyword's monthly search volumes (monthly[])."
  }
 }
}
```

## Response schema (JSON Schema)

```json
{
 "type": "json",
 "example": {
  "total": 2,
  "units": "volume: average monthly Google searches; cpc: US dollars; competition: 0-1 (Google Ads); competitionLevel: LOW|MEDIUM|HIGH; difficulty: 0-100; intent: informational|navigational|commercial|transactional; trendYoyPct: % change vs a year ago",
  "market": {
   "country": "US",
   "fallback": false,
   "languageCode": "en",
   "locationCode": 2840,
   "locationName": "United States"
  },
  "source": "DataForSEO Labs (Google Ads data)",
  "missing": [],
  "results": [
   {
    "cpc": 4.63,
    "intent": "informational",
    "volume": 673000,
    "keyword": "phone",
    "difficulty": 54,
    "competition": 0.76,
    "trendYoyPct": 50,
    "competitionLevel": "HIGH"
   },
   {
    "cpc": 1.39,
    "intent": "transactional",
    "volume": 550000,
    "keyword": "watch",
    "difficulty": 54,
    "competition": 0.95,
    "trendYoyPct": 22,
    "competitionLevel": "HIGH"
   }
  ],
  "dataAsOf": "2026-09-16T03:19:59Z",
  "see_also": {
   "params": [
    "keywords",
    "country",
    "lang"
   ],
   "reason": "Prefer a GET? search-volume returns the same fields for up to 20 comma-separated keywords.",
   "endpoint": "https://keywords.duoleads.com/v1/search-volume"
  },
  "request_id": "01KEXAMPLE0000000000000000"
 }
}
```

## More

- Live health (JSON, refreshed every minute): https://www.zero.xyz/c/keyword-search-volume-cpc-bulk-e88c0cb2/health.json
- [Zero catalog index](https://www.zero.xyz/llms.txt)
- [Other services from keywords.duoleads.com](https://www.zero.xyz/host/keywords.duoleads.com/llms.txt)
