Nexscope

Category Domain Monthly Comparison

Compare the monthly search performance of domains in a product category. Call it via REST API or MCP to automate SEO research in your app or AI agent.

CostRecent 198 credits / call
Try online
POST · https://api.nexscope.ai/seo/categoryDomainComparisonMCP · nexscope_seo_category_domain_comparison

Choose an integration method

Competitors & Traffic

What this API does

Compare the monthly search performance of domains in a product category. The request accepts categoryIds, firstMonth, language, limit, market. Its documented result includes categoryIds, comparisonDirection, engine, firstMonth, change.estimatedMonthlyVisits, change.serpCount, currentEstimatedMonthlyVisits, currentSerpCount.

Category Domain Monthly Comparison API use cases

Compare competitor visibility

To compare competitor visibility, a search marketer submits categoryIds and firstMonth to Category Domain Monthly Comparison. The returned categoryIds, comparisonDirection, engine help identify websites competing for relevant search visibility.

Identify pages for further research

A search marketer uses Category Domain Monthly Comparison with categoryIds and firstMonth to identify pages for further research. The returned categoryIds, comparisonDirection, engine help shortlist pages or queries for a deeper comparison.

Prepare a website performance review

For this workflow, a search marketer calls Category Domain Monthly Comparison with categoryIds and firstMonth to prepare a website performance review. The result helps assemble evidence for a website performance discussion.

Category Domain Monthly Comparison API FAQ

What does the Category Domain Monthly Comparison API return?

Compare the monthly search performance of domains in a product category. The documented output includes categoryIds, comparisonDirection, engine, firstMonth, change.estimatedMonthlyVisits, change.serpCount, currentEstimatedMonthlyVisits, currentSerpCount. It corresponds to the supplied categoryIds, firstMonth, language, limit, market. Optional fields can be absent; a missing value should not be interpreted as a measured zero. Example values illustrate the response shape, rather than live account results.

How many credits does the Category Domain Monthly Comparison API cost?

The current documented cost is Recent 198 credits / call. This is the same cost shown at the top of this page. If a range or estimate is displayed, the final charge depends on the request. Review your available credits and the pricing page before calling the API, and check API usage records for the actual charge.

How do I call the Category Domain Monthly Comparison API from my app or an MCP client?

Send a POST request to https://api.nexscope.ai/seo/categoryDomainComparison with your API key as a Bearer token and the JSON inputs shown in API integration. In a compatible MCP client such as Claude or Cursor, connect Nexscope and call nexscope_seo_category_domain_comparison. Use the MCP arguments shown in the MCP guide, or switch Online test to MCP to review its request before adding it to your app.

View plans and creditsConnect this API with MCP

Try this API
Endpoint
https://api.nexscope.ai/seo/categoryDomainComparison
MCP method
nexscope_seo_category_domain_comparison

Step 1 of 3 · Authenticate

Authentication

All run endpoints require a user API key. Send it as a bearer token in the Authorization header.

Authorization: Bearer nk-xxxxxxxxxxxxxxxxx
Missing or invalid API keys return an authentication error. Manage keys from .

Step 2 of 3 · Send a request

POSThttps://api.nexscope.ai/seo/categoryDomainComparison

Run an API

Send a JSON request body using the parameters described below.

Example request

Replace YOUR_API_KEY, then run this command in your terminal.

curl -X POST 'https://api.nexscope.ai/seo/categoryDomainComparison' \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "categoryIds": [
    12191
  ],
  "firstMonth": "2026-01",
  "language": "en",
  "limit": 10,
  "market": "US",
  "secondMonth": "2026-02"
}'

Step 3 of 3 · Inspect the result

Check the response

Read code for the request status and data for the result. Open the parameter and response reference for the full field definitions.

HTTP status codes

CodeDescription
200HTTP request completed. Check JSON code; only 0 indicates business success or acceptance.
400Request JSON or required API parameters are invalid.
401API key is missing, invalid, or cannot be matched to a user.
5xxAPI execution or upstream service failed.
All categories/ Competitors & Traffic
POSThttps://api.nexscope.ai/seo/categoryDomainComparison

Run this API

Send a JSON request to execute this API and receive the documented response payload.

Endpoint

MethodPOST
Pathhttps://api.nexscope.ai/seo/categoryDomainComparison
AuthBearer API key
Content-Typeapplication/json

Request parameters

NameTypeRequiredDescription
categoryIdsarrayrequired
Category ids value used by this API operation.
Minimum items: 1
Maximum items: 5
categoryIds[]integerrequired
Item in categoryIds.
Minimum: 1
Maximum: 2147483647
firstMonthstringrequired
First month value used by this API operation.
Pattern: ^\d{4}-\d{2}$
languagestringoptional
Language value used by this API operation.
Constant: en
Default: en
limitintegeroptional
Limit value used by this API operation.
Default: 10
Minimum: 1
Maximum: 20
marketstringoptional
Market value used by this API operation.
Constant: US
Default: US
secondMonthstringrequired
Second month value used by this API operation.
Pattern: ^\d{4}-\d{2}$

Code example

{
  "categoryIds": [
    12191
  ],
  "firstMonth": "2026-01",
  "language": "en",
  "limit": 10,
  "market": "US",
  "secondMonth": "2026-02"
}

Response example

Example response envelope from the documented SEO API contract.

{
  "code": 0,
  "cost": "-1",
  "data": {
    "callId": "synthetic-call",
    "completedAt": null,
    "coverage": {
      "missing": [
        {
          "field": "synthetic",
          "reason": "UPSTREAM_FIELD_MISSING"
        }
      ],
      "status": "PARTIAL"
    },
    "requestedAt": "123",
    "result": {
      "categoryIds": [
        1
      ],
      "comparisonDirection": "synthetic",
      "engine": "synthetic",
      "firstMonth": "synthetic",
      "items": [
        {
          "categoryIds": [
            1
          ],
          "change": {
            "estimatedMonthlyVisits": 1.25,
            "serpCount": 9007199254740992
          },
          "currentEstimatedMonthlyVisits": 1.25,
          "currentSerpCount": 9007199254740992,
          "domain": "synthetic",
          "first": {
            "month": "synthetic",
            "organic": {
              "estimatedEquivalentAdsCostUsd": "synthetic",
              "estimatedMonthlyVisits": 1.25,
              "positions": {
                "p1": 9007199254740992,
                "p11to20": 9007199254740992,
                "p21to30": 9007199254740992,
                "p2to3": 9007199254740992,
                "p31to40": 9007199254740992,
                "p41to50": 9007199254740992,
                "p4to10": 9007199254740992,
                "p51to60": 9007199254740992,
                "p61to70": 9007199254740992,
                "p71to80": 9007199254740992,
                "p81to90": 9007199254740992,
                "p91to100": 9007199254740992
              },
              "serpCount": 9007199254740992
            }
          },
          "mainDomain": "synthetic",
          "missing": [
            {
              "field": "synthetic",
              "reason": "synthetic"
            }
          ],
          "second": {
            "month": "synthetic",
            "organic": {
              "estimatedEquivalentAdsCostUsd": "synthetic",
              "estimatedMonthlyVisits": 1.25,
              "positions": {
                "p1": 9007199254740992,
                "p11to20": 9007199254740992,
                "p21to30": 9007199254740992,
                "p2to3": 9007199254740992,
                "p31to40": 9007199254740992,
                "p41to50": 9007199254740992,
                "p4to10": 9007199254740992,
                "p51to60": 9007199254740992,
                "p61to70": 9007199254740992,
                "p71to80": 9007199254740992,
                "p81to90": 9007199254740992,
                "p91to100": 9007199254740992
              },
              "serpCount": 9007199254740992
            }
          }
        }
      ],
      "language": "synthetic",
      "market": "synthetic",
      "missing": [
        {
          "field": "synthetic",
          "reason": "synthetic"
        }
      ],
      "normalizedCategoryIds": [
        1
      ],
      "ordering": "synthetic",
      "requestedLimit": 1,
      "returnedCount": 1,
      "secondMonth": "synthetic",
      "sourceProduct": "synthetic",
      "taxonomy": "synthetic",
      "trafficKind": "synthetic",
      "truncated": false
    },
    "schemaVersion": "synthetic",
    "source": "synthetic",
    "status": "PARTIAL",
    "usage": {
      "billingStatus": "UNAPPROVED",
      "chargedCredits": "0"
    }
  },
  "msg": null,
  "time": "2026-01-01 00:00:00",
  "traceId": "synthetic-trace",
  "ts": "9007199254740993"
}

Response fields

NameTypeRequiredDescription
codeintegerrequired
0 is a successful envelope; inspect data.status separately.
Allowed: 0, 42008, 42009
coststringrequired
Elapsed processing milliseconds; not price. -1 for non-web context.
dataobjectrequired
Data value used by this API operation.
data.callIdstring | nulloptional
Call id value used by this API operation.
data.completedAtstring | integer | nulloptional
Completed at value used by this API operation.
data.coverageobjectoptional
Coverage value used by this API operation.
data.coverage.missingarrayoptional
Missing value used by this API operation.
data.coverage.missing[]objectrequired
Item in data coverage missing.
data.coverage.missing[].fieldstringoptional
Field value used by this API operation.
data.coverage.missing[].reasonstringoptional
Reason value used by this API operation.
data.coverage.statusstringoptional
Status value used by this API operation.
data.requestedAtstring | integer | nulloptional
Requested at value used by this API operation.
data.resultobject | nullrequired
Result value used by this API operation.
data.result.categoryIdsarrayrequired
Category ids value used by this API operation.
Minimum items: 1
Maximum items: 5
data.result.categoryIds[]integerrequired
Item in data result categoryIds.
Minimum: 1
data.result.comparisonDirectionstringrequired
Comparison direction value used by this API operation.
Constant: second_minus_first
data.result.enginestringrequired
Engine value used by this API operation.
Constant: google
data.result.firstMonthstringrequired
First month value used by this API operation.
data.result.itemsarrayrequired
Items value used by this API operation.
Minimum items: 0
Maximum items: 20
data.result.items[]objectrequired
Item in data result items.
data.result.items[].categoryIdsarrayrequired
Category ids value used by this API operation.
Minimum items: 0
Maximum items: 10000
data.result.items[].categoryIds[]integerrequired
Item in data result items[] categoryIds.
Minimum: 1
data.result.items[].changeobjectrequired
Change value used by this API operation.
data.result.items[].change.estimatedMonthlyVisitsnumber | nullrequired
Estimated monthly visits value used by this API operation.
data.result.items[].change.serpCountinteger | nullrequired
Serp count value used by this API operation.
data.result.items[].currentEstimatedMonthlyVisitsnumber | nullrequired
Current estimated monthly visits value used by this API operation.
Minimum: 0
data.result.items[].currentSerpCountinteger | nullrequired
Current serp count value used by this API operation.
Minimum: 0
data.result.items[].domainstringrequired
Domain value used by this API operation.
data.result.items[].firstobjectrequired
First value used by this API operation.
data.result.items[].first.monthstringrequired
Month value used by this API operation.
data.result.items[].first.organicobjectrequired
Organic value used by this API operation.
data.result.items[].first.organic.estimatedEquivalentAdsCostUsdstring | nullrequired
Estimated equivalent ads cost usd value used by this API operation.
Pattern: ^(0|[1-9][0-9]*)(\.[0-9]+)?$
data.result.items[].first.organic.estimatedMonthlyVisitsnumber | nullrequired
Estimated monthly visits value used by this API operation.
Minimum: 0
data.result.items[].first.organic.positionsobjectrequired
Positions value used by this API operation.
data.result.items[].first.organic.positions.p1integer | nullrequired
P1 value used by this API operation.
Minimum: 0
data.result.items[].first.organic.positions.p11to20integer | nullrequired
P11to20 value used by this API operation.
Minimum: 0
data.result.items[].first.organic.positions.p21to30integer | nullrequired
P21to30 value used by this API operation.
Minimum: 0
data.result.items[].first.organic.positions.p2to3integer | nullrequired
P2to3 value used by this API operation.
Minimum: 0
data.result.items[].first.organic.positions.p31to40integer | nullrequired
P31to40 value used by this API operation.
Minimum: 0
data.result.items[].first.organic.positions.p41to50integer | nullrequired
P41to50 value used by this API operation.
Minimum: 0
data.result.items[].first.organic.positions.p4to10integer | nullrequired
P4to10 value used by this API operation.
Minimum: 0
data.result.items[].first.organic.positions.p51to60integer | nullrequired
P51to60 value used by this API operation.
Minimum: 0
data.result.items[].first.organic.positions.p61to70integer | nullrequired
P61to70 value used by this API operation.
Minimum: 0
data.result.items[].first.organic.positions.p71to80integer | nullrequired
P71to80 value used by this API operation.
Minimum: 0
data.result.items[].first.organic.positions.p81to90integer | nullrequired
P81to90 value used by this API operation.
Minimum: 0
data.result.items[].first.organic.positions.p91to100integer | nullrequired
P91to100 value used by this API operation.
Minimum: 0
data.result.items[].first.organic.serpCountinteger | nullrequired
Serp count value used by this API operation.
Minimum: 0
data.result.items[].mainDomainstring | nullrequired
Main domain value used by this API operation.
data.result.items[].missingarrayrequired
Missing value used by this API operation.
Minimum items: 0
data.result.items[].missing[]objectrequired
Item in data result items[] missing.
data.result.items[].missing[].fieldstringrequired
Field value used by this API operation.
data.result.items[].missing[].reasonstringrequired
Reason value used by this API operation.
Allowed: UPSTREAM_FIELD_MISSING, UPSTREAM_FIELD_INVALID, DUPLICATE_UPSTREAM_ITEM, UPSTREAM_ITEM_MISSING
data.result.items[].secondobjectrequired
Second value used by this API operation.
data.result.items[].second.monthstringrequired
Month value used by this API operation.
data.result.items[].second.organicobjectrequired
Organic value used by this API operation.
data.result.items[].second.organic.estimatedEquivalentAdsCostUsdstring | nullrequired
Estimated equivalent ads cost usd value used by this API operation.
Pattern: ^(0|[1-9][0-9]*)(\.[0-9]+)?$
data.result.items[].second.organic.estimatedMonthlyVisitsnumber | nullrequired
Estimated monthly visits value used by this API operation.
Minimum: 0
data.result.items[].second.organic.positionsobjectrequired
Positions value used by this API operation.
data.result.items[].second.organic.positions.p1integer | nullrequired
P1 value used by this API operation.
Minimum: 0
data.result.items[].second.organic.positions.p11to20integer | nullrequired
P11to20 value used by this API operation.
Minimum: 0
data.result.items[].second.organic.positions.p21to30integer | nullrequired
P21to30 value used by this API operation.
Minimum: 0
data.result.items[].second.organic.positions.p2to3integer | nullrequired
P2to3 value used by this API operation.
Minimum: 0
data.result.items[].second.organic.positions.p31to40integer | nullrequired
P31to40 value used by this API operation.
Minimum: 0
data.result.items[].second.organic.positions.p41to50integer | nullrequired
P41to50 value used by this API operation.
Minimum: 0
data.result.items[].second.organic.positions.p4to10integer | nullrequired
P4to10 value used by this API operation.
Minimum: 0
data.result.items[].second.organic.positions.p51to60integer | nullrequired
P51to60 value used by this API operation.
Minimum: 0
data.result.items[].second.organic.positions.p61to70integer | nullrequired
P61to70 value used by this API operation.
Minimum: 0
data.result.items[].second.organic.positions.p71to80integer | nullrequired
P71to80 value used by this API operation.
Minimum: 0
data.result.items[].second.organic.positions.p81to90integer | nullrequired
P81to90 value used by this API operation.
Minimum: 0
data.result.items[].second.organic.positions.p91to100integer | nullrequired
P91to100 value used by this API operation.
Minimum: 0
data.result.items[].second.organic.serpCountinteger | nullrequired
Serp count value used by this API operation.
Minimum: 0
data.result.languagestringrequired
Language value used by this API operation.
Constant: en
data.result.marketstringrequired
Market value used by this API operation.
Constant: US
data.result.missingarrayrequired
Missing value used by this API operation.
Minimum items: 0
data.result.missing[]objectrequired
Item in data result missing.
data.result.missing[].fieldstringrequired
Field value used by this API operation.
data.result.missing[].reasonstringrequired
Reason value used by this API operation.
Allowed: UPSTREAM_FIELD_MISSING, UPSTREAM_FIELD_INVALID, DUPLICATE_UPSTREAM_ITEM, UPSTREAM_ITEM_MISSING
data.result.normalizedCategoryIdsarrayrequired
Normalized category ids value used by this API operation.
Minimum items: 1
Maximum items: 5
data.result.normalizedCategoryIds[]integerrequired
Item in data result normalizedCategoryIds.
Minimum: 1
data.result.orderingstringrequired
Ordering value used by this API operation.
Constant: current_organic_etv_desc
data.result.requestedLimitintegerrequired
Requested limit value used by this API operation.
Minimum: 1
Maximum: 20
data.result.returnedCountintegerrequired
Returned count value used by this API operation.
Minimum: 0
data.result.secondMonthstringrequired
Second month value used by this API operation.
data.result.sourceProductstringrequired
Source product value used by this API operation.
Constant: dataforseo_labs
data.result.taxonomystringrequired
Taxonomy value used by this API operation.
Constant: google_product_service
data.result.trafficKindstringrequired
Traffic kind value used by this API operation.
Constant: estimated
data.result.truncatedbooleanrequired
Truncated value used by this API operation.
data.schemaVersionstring | nulloptional
Schema version value used by this API operation.
data.sourcestring | nulloptional
Source value used by this API operation.
data.statusstringoptional
Status value used by this API operation.
Allowed: SUCCESS, PARTIAL, EMPTY, PROCESSING, UNKNOWN, FAILED
data.usageobject | nulloptional
Usage value used by this API operation.
data.usage.billingStatusstring | nulloptional
Billing status value used by this API operation.
data.usage.chargedCreditsstring | integer | nulloptional
Charged credits value used by this API operation.
msgstring | nullrequired
Available upstream msg/errmsg/message is preferred for success and failure; Chinese is translated to English. Missing successful message is null. Platform-only errors and task states use platform English. Message text never determines success or retry.
timestringrequired
yyyy-MM-dd HH:mm:ss
traceIdstring | nullrequired
Trace id value used by this API operation.
tsstringrequired
Epoch milliseconds; global long serializer.

Accepted processing response

code 0 confirms acceptance. Use data.callId to query the same request; processing is not completion.

NameTypeRequiredDescription
codeintegerrequired
0 is a successful envelope; inspect data.status separately.
Constant: 0
coststringrequired
Elapsed processing milliseconds; not price. -1 for non-web context.
dataobjectrequired
Data value used by this API operation.
data.callIdstring | nullrequired
Call id value used by this API operation.
data.reasonstringrequired
Reason value used by this API operation.
Constant: IN_PROGRESS
data.retryablebooleanoptional
Retryable value used by this API operation.
data.statusstringrequired
Status value used by this API operation.
Constant: PROCESSING
data.taskIdstring | nulloptional
Task id value used by this API operation.
msgstring | nullrequired
Available upstream msg/errmsg/message is preferred for success and failure; Chinese is translated to English. Missing successful message is null. Platform-only errors and task states use platform English. Message text never determines success or retry.
timestringrequired
yyyy-MM-dd HH:mm:ss
traceIdstring | nullrequired
Trace id value used by this API operation.
tsstringrequired
Epoch milliseconds; global long serializer.

Error response

NameTypeRequiredDescription
codeintegerrequired
0 is a successful envelope; inspect data.status separately.
coststringrequired
Elapsed processing milliseconds; not price. -1 for non-web context.
dataobjectrequired
Data value used by this API operation.
data.callIdstring | nullrequired
Call id value used by this API operation.
data.reasonstring | nullrequired
Reason value used by this API operation.
data.retryablebooleanoptional
Retryable value used by this API operation.
data.statusstring | nullrequired
Status value used by this API operation.
data.taskIdstring | nulloptional
Task id value used by this API operation.
msgstring | nullrequired
Available upstream msg/errmsg/message is preferred for success and failure; Chinese is translated to English. Missing successful message is null. Platform-only errors and task states use platform English. Message text never determines success or retry.
timestringrequired
yyyy-MM-dd HH:mm:ss
traceIdstring | nullrequired
Trace id value used by this API operation.
tsstringrequired
Epoch milliseconds; global long serializer.

Retrieve a processing result

A response with PROCESSING and a callId means the result is still being prepared. Use the result query below with the returned identifier. This lookup reads the stored result and does not spend credits.

curl -X GET https://api.nexscope.ai/seo/categoryDomainComparison/calls/{callId} \
  -H "Authorization: Bearer nk-xxxxxxxxxxxxxxxxx"

Responses

CodeDescription
200HTTP request completed. Check JSON code; only 0 indicates business success or acceptance.
400Request JSON or required API parameters are invalid.
401API key is missing, invalid, or cannot be matched to a user.
5xxAPI execution or upstream service failed.

Data source, freshness, and limitations

Source, freshness, coverage, rate limits, and estimation notes are not specified in this API definition unless they appear in the request or response field documentation above. Do not assume official marketplace data or real-time freshness when it is not explicitly documented.

Step 1 of 2 · Connect your MCP client

MCP

V2 recommended

Connect remote agents through the standard MCP 2025-11-25 Streamable HTTP endpoint. Use OAuth 2.1 Authorization Code with PKCE, or an API key for compatibility.

POST https://api.nexscope.ai/mcp
MCP-Protocol-Version: 2025-11-25
Content-Type: application/json
Authentication

OAuth clients request the mcp:tools scope. The endpoint's 401 response advertises protected-resource metadata for authorization discovery.

Step 2 of 2 · Call the tool

Call a tool

{
  "jsonrpc": "2.0",
  "id": "tool-call-1",
  "method": "tools/call",
  "params": {
    "name": "nexscope_seo_category_domain_comparison",
    "arguments": {
      "categoryIds": [
        12191
      ],
      "firstMonth": "2026-01",
      "language": "en",
      "limit": 10,
      "market": "US",
      "secondMonth": "2026-02"
    }
  }
}

Legacy MCP v1

Existing API-key clients can continue using the compatibility endpoint. New integrations should use MCP v2.

GET / POST /mcp/legacy

Online test

Execute the current API with your API key and JSON payload. Online tests use this site's configured API environment; the Endpoint and copyable examples use the public integration address.

Uses your signed-in Nexscope session
SEO API Lab

Category Related Domain Monthly Comparison

Compare the monthly search performance of domains in a product category. Call it via REST API or MCP to automate SEO research in your app or AI agent.

Live request
Estimated 19 credits / callAPI usage records
*
Value sent as the “categoryIds” request parameter.

1–5 values

*
Value sent as the “firstMonth” request parameter.
Value sent as the “language” request parameter.
Value sent as the “limit” request parameter.

1–20

Value sent as the “market” request parameter.
*
Value sent as the “secondMonth” request parameter.

Live calls may use Data credits.

Processing result

If a request is still processing, use the returned identifier to retrieve its stored result. The tester recognizes the identifier automatically, and result queries do not spend credits.

Live response

Results

Your live result will appear here.

Complete the request fields above and run the API. No sample response is substituted.

Test with an API key or MCP
Estimated 19 credits / callAPI usage records

Try it

Send a real request with the same contract shown in the reference.

Endpoint
/seo/categoryDomainComparison
Processing result endpoint
https://api.nexscope.ai/seo/categoryDomainComparison/calls/{resultId}
MCP method
nexscope_seo_category_domain_comparison
cURL
curl -X POST \
  https://api.nexscope.ai/seo/categoryDomainComparison \
  -H "Authorization: Bearer nk-..." \
  -H "Content-Type: application/json" \
  -d '{ "categoryIds": [ 12191 ], "firstMonth": "2026-01", "language": "en", "limit": 10, "market": "US", "secondMonth": "2026-02" }'
Response
No response yet. Run the request to see the response here.
Processing result

Use the identifier returned by Run request. The tester selects the correct result query automatically, and result queries do not spend credits.

Result response
No task result yet. Query the task to see the generated output here.

Related APIs