SearchChampSearchChamp
API Documentation

Endpoint reference

Methods, query parameters, payloads, and responses for every supported SearchChamp REST endpoint.

All public v1 routes are read-only GET requests. They accept no request body and return JSON in the common { data, meta, errors } envelope.

This is the complete REST endpoint list

There are currently four public REST endpoints. Content Writer generation, Research Studio sessions, publishing, actions, backlinks, and opportunities are not missing from this page: they are not public REST routes. Review feature coverage for the supported MCP or app path for each capability.

Shared site parameter

Every route requires site as a query parameter. Use the site's exact domain, such as example.com, or its SearchChamp slug.

ResultBehavior
One site matches inside the key's organizationThe request continues.
No accessible site matches404 NOT_FOUND. A site outside the organization is indistinguishable from a missing site.
More than one site matches400 BAD_REQUEST; retry with the exact domain.
site is missing or blank400 BAD_REQUEST.

GET /v1/api/rankings

Returns the keywords whose organic positions moved most over a trailing window.

Query parameterRequiredRules
siteYesDomain or site slug.
daysNoPositive integer; default 7, maximum 90. Invalid/non-positive values use the default.
limitNoPositive integer; default 10, maximum 100. Invalid/non-positive values use the default.
curl --get 'https://api.searchchamp.com/v1/api/rankings' \
  --header "Authorization: Bearer $SEARCHCHAMP_API_KEY" \
  --data-urlencode 'site=example.com' \
  --data-urlencode 'days=14' \
  --data-urlencode 'limit=5'
{
  "data": {
    "site": "example.com",
    "days": 14,
    "movers": [
      {
        "keyword": "seo tools",
        "from": 12,
        "to": 7,
        "delta": 5
      }
    ]
  },
  "meta": {},
  "errors": []
}

delta is from - to, so a positive number means improvement. from, to, and delta can be null when the keyword was unranked at one checkpoint.

GET /v1/api/ai-visibility/summary

Returns the latest 30-day AI Visibility rollup and tracked-prompt lifecycle counts.

Query parameterRequiredRules
siteYesDomain or site slug.
curl --get 'https://api.searchchamp.com/v1/api/ai-visibility/summary' \
  --header "Authorization: Bearer $SEARCHCHAMP_API_KEY" \
  --data-urlencode 'site=example.com'
{
  "data": {
    "site": "example.com",
    "ai_visibility": {
      "score": 0.41,
      "activePrompts": 8,
      "pausedPrompts": 1,
      "summary": {
        "appearanceRate": 0.41,
        "shareOfVoice": 0.18,
        "computedAt": "2026-08-28T08:30:00.000Z"
      }
    }
  },
  "meta": {},
  "errors": []
}

If the site has no AI Visibility setup, the valid 200 response is:

{
  "data": {
    "site": "example.com",
    "setup_required": true,
    "reason": "no_ai_visibility"
  },
  "meta": {},
  "errors": []
}

GET /v1/api/keywords

Returns tracked keywords, best-ranked first. Unranked keywords sort last.

Query parameterRequiredRules
siteYesDomain or site slug.
limitNoPositive integer; default 50, maximum 500. Invalid/non-positive values use the default.
curl --get 'https://api.searchchamp.com/v1/api/keywords' \
  --header "Authorization: Bearer $SEARCHCHAMP_API_KEY" \
  --data-urlencode 'site=example.com' \
  --data-urlencode 'limit=100'
{
  "data": {
    "site": "example.com",
    "keywords": [
      {
        "keyword": "seo tools",
        "position": 7,
        "unranked": false,
        "volume": 1200,
        "clusterLabel": "SEO software"
      }
    ]
  },
  "meta": {},
  "errors": []
}

position, volume, and clusterLabel can be null. unranked explicitly distinguishes a missing/zero ranking from a ranked keyword.

GET /v1/api/audit-issues

Returns the latest completed audit's scores and issue counts. Despite the route name, v1 returns the summary and counts, not individual issue rows. Use the MCP get_audit_issues tool when an AI client needs finding titles and page URLs.

Query parameterRequiredRules
siteYesDomain or site slug.
curl --get 'https://api.searchchamp.com/v1/api/audit-issues' \
  --header "Authorization: Bearer $SEARCHCHAMP_API_KEY" \
  --data-urlencode 'site=example.com'
{
  "data": {
    "site": "example.com",
    "audit": {
      "latestRun": {
        "id": "93a84854-79ce-42a3-b38f-259426b4ce26",
        "completedAt": "2026-08-28T07:00:00.000Z",
        "scores": {
          "overall": 78,
          "aiCrawl": 81,
          "decay": 12,
          "technical": 90
        }
      },
      "issueCounts": {
        "critical": 2,
        "warn": 9,
        "info": 14
      }
    }
  },
  "meta": {},
  "errors": []
}

Any score can be null. If no audit has completed, the route returns 200 with setup_required: true and reason: "no_audit" instead of an audit object.

Request bodies and idempotency

These routes ignore no hidden payload: they accept no request body. Because every route is a read, there is no idempotency-key header and repeating an identical request does not create or modify product data. Each successful call still counts toward usage; cache results in your integration when appropriate.

On this page