superagnt_
CompetitorsKeywords

Keyword gap between two domains

POST/keyword-gap
priced per calljson responserest · mcp
01// about this endpoint

Compares two domains' organic rankings keyword by keyword. Each row carries keyword_data plus first_domain_serp_element (target1's ranking) and second_domain_serp_element (target2's) with rank_absolute, rank_group and the ranked URL. The classic gap query is: competitor ranks well, you don't — filters: [["first_domain_serp_element.rank_absolute",">",20],"and",["second_domain_serp_element.rank_absolute","<=",10]] with target1 = you, target2 = the competitor (a missing element means that domain does not rank at all). Cost scales with rows; the default 100 is enough for most gap analyses.

02// code samples

Call it over REST

Authenticate with a bearer token against https://api.agntdata.dev. Swap the placeholders for your key and parameter values.

curlbash
curl -s -X POST "https://api.agntdata.dev/keyword-gap" \
  -H "Authorization: Bearer <YOUR_AGNTDATA_API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{ "target1": "<string>", "target2": "<string>" }'
03// give it to your agent

Copy-paste prompt

Paste this into a coding agent. It connects the superagnt MCP server, finds the tool data_seo_keyword_gap, and runs a first call — with the REST fallback if MCP is unavailable.

agent prompttext
You are wiring up the agntdata "SEO" API to use this endpoint: Keyword gap between two domains.

1. CONNECT over MCP (preferred). Add the superagnt MCP server, then let the client
   run OAuth on first tool call — no token to paste:
     claude mcp add --scope user --transport http superagnt https://mcp.superagnt.com/mcp
     claude mcp login superagnt
   MCP endpoint: https://mcp.superagnt.com/mcp
   After connecting, the tool you want is named exactly:
     data_seo_keyword_gap
   Call agnt_tools_search or agnt_tools_list_enabled to confirm it is available.

2. REST fallback (if you are not using MCP):
     POST https://api.agntdata.dev/keyword-gap
     Header: Authorization: Bearer <YOUR_AGNTDATA_API_KEY>
   Required parameters:
    - target1 (string, required) — First domain (e.g. your domain), no protocol.
    - target2 (string, required) — Second domain (e.g. a competitor), no protocol.
   Optional parameters:
    - location_code (integer, optional) — Geo target as a location code. Default 2840 (United States).
    - language_code (string, optional) — Two-letter language code. Default 'en'.
    - limit (integer, optional) — Max intersecting keywords to return. Default 100.
    - offset (integer, optional) — Pagination offset.
    - filters (array, optional) — Optional filter expression as [field, operator, value] triples joined by 'and'/'or'. Operators: =, <>, <, <=, >, >=, in, not_in, like, not_like. Recipe (their wins, your gaps): [["first_domain_serp_element.rank_absolute",">",20],"and",["second_domain_serp_element.rank_absolute","<=",10]].
    - order_by (array, optional) — Sort rules.

3. COST & KEY. This endpoint is priced per call in credits, and each successful response reports its own cost in its meta.costCents field. Only successful calls are charged.
   Get an agntdata API key at https://app.agntdata.dev.

4. TEST. Connect the server (or set the key), discover the tool
   (data_seo_keyword_gap), run one minimal call with just the required parameters,
   and report back the shape of the JSON response (top-level fields).

Reference (machine-readable variant): https://superagnt.com/docs/apis/seo/endpoints/keyword_gap.md
mcp tool definitionjson
{
  "name": "keyword_gap",
  "description": "Compares two domains' organic rankings keyword by keyword. Each row carries keyword_data plus first_domain_serp_element (target1's ranking) and second_domain_serp_element (target2's) with rank_absolute, rank_group and the ranked URL. The classic gap query is: competitor ranks well, you don't — filters: [[\"first_domain_serp_element.rank_absolute\",\">\",20],\"and\",[\"second_domain_serp_element.rank_absolute\",\"<=\",10]] with target1 = you, target2 = the competitor (a missing element means that domain does not rank at all). Cost scales with rows; the default 100 is enough for most gap analyses.",
  "parameters": {
    "type": "object",
    "properties": {
      "target1": {
        "type": "string",
        "description": "First domain (e.g. your domain), no protocol."
      },
      "target2": {
        "type": "string",
        "description": "Second domain (e.g. a competitor), no protocol."
      },
      "location_code": {
        "type": "integer",
        "description": "Geo target as a location code. Default 2840 (United States).",
        "default": 2840
      },
      "language_code": {
        "type": "string",
        "description": "Two-letter language code. Default 'en'.",
        "default": "en"
      },
      "limit": {
        "type": "integer",
        "minimum": 1,
        "maximum": 1000,
        "default": 100,
        "description": "Max intersecting keywords to return. Default 100."
      },
      "offset": {
        "type": "integer",
        "minimum": 0,
        "description": "Pagination offset."
      },
      "filters": {
        "type": "array",
        "items": {},
        "description": "Optional filter expression as [field, operator, value] triples joined by 'and'/'or'. Operators: =, <>, <, <=, >, >=, in, not_in, like, not_like. Recipe (their wins, your gaps): [[\"first_domain_serp_element.rank_absolute\",\">\",20],\"and\",[\"second_domain_serp_element.rank_absolute\",\"<=\",10]]."
      },
      "order_by": {
        "type": "array",
        "items": {
          "type": "string"
        },
        "description": "Sort rules."
      }
    },
    "required": [
      "target1",
      "target2"
    ]
  }
}
04// parameters
NameInTypeRequiredDescription
target1bodystringrequiredFirst domain (e.g. your domain), no protocol.
target2bodystringrequiredSecond domain (e.g. a competitor), no protocol.
location_codebodyintegeroptionalGeo target as a location code. Default 2840 (United States).
language_codebodystringoptionalTwo-letter language code. Default 'en'.
limitbodyintegeroptionalMax intersecting keywords to return. Default 100.
offsetbodyintegeroptionalPagination offset.
filtersbodyarrayoptionalOptional filter expression as [field, operator, value] triples joined by 'and'/'or'. Operators: =, <>, <, <=, >, >=, in, not_in, like, not_like. Recipe (their wins, your gaps): [["first_domain_serp_element.rank_absolute",">",20],"and",["second_domain_serp_element.rank_absolute","<=",10]].
order_bybodyarrayoptionalSort rules.
05// responses

Keywords both domains rank for, with each domain's position, in `result[0].items`.

200json
{
  "type": "object"
}
06// pricing
priced per call

This endpoint is priced per call and deducted from your agntdata balance; only a successful call is billed. Every billable response reports its own cost in meta.costCents.

Get a key at app.agntdata.dev.

08// more from SEO

start calling

Point your client at https://mcp.superagnt.com/mcp and your agent has this endpoint, plus every other source on one balance.

Start free