Citerank Public API

Query AI visibility scores for any domain programmatically. Embed scores in dashboards, client reports, and agency tools. All responses are JSON.

Base URL: https://citerankscore.com/api/v1  ·  API keys are generated in Settings → Developer API.

Authentication

All requests require an API key. Pass it in one of two ways:

# Option 1 — Authorization header (recommended)
curl -H "Authorization: Bearer crk_live_your_key_here" \
     "https://citerankscore.com/api/v1/score?domain=example.com"

# Option 2 — Custom header
curl -H "X-Citerank-Key: crk_live_your_key_here" \
     "https://citerankscore.com/api/v1/score?domain=example.com"

Rate Limits

Free
10
requests / day
Starter
100
requests / day
Pro
1,000
requests / day
Agency
unlimited

Rate limit headers are returned on every response: X-RateLimit-Limit, X-RateLimit-Remaining. Limits reset at midnight UTC.

Endpoints

GET /api/v1/score Query AI visibility score for a domain

Parameters

ParameterTypeRequiredDescription
domainstringRequiredDomain to query. Protocol is optional — example.com and https://example.com both work.

Response

{
  "success": true,
  "domain": "example.com",
  "score": 74,
  "grade": "B",
  "dimensions": {
    "schemaEntity":      61,
    "discoverability":   78,
    "agenticProtocol":   55,
    "contentCitability": 82,
    "entityPresence":    69
  },
  "last_scanned": "2026-07-01T08:00:00.000Z",
  "source": "snapshot",
  "api_key": "My Agency Key",
  "meta": {
    "powered_by": "Citerank — AI Search Visibility",
    "docs": "https://citerankscore.com/docs/api"
  }
}

Dimension keys: schemaEntity (schema & entity markup), discoverability (llms.txt, robots, sitemaps), agenticProtocol (A2A/WebMCP readiness), contentCitability (passage-level citation quality), entityPresence (brand entity signals). source is "snapshot" (weekly Citerank Score run) or "scan" (most recent individual tool scan — dimension keys may vary by tool).

No data found

If no scan exists for the domain yet, the endpoint returns HTTP 200 with score: null rather than a 404 — so your code doesn't need special error handling for new domains.

{
  "success": true,
  "domain": "newdomain.com",
  "score": null,
  "grade": null,
  "dimensions": {},
  "last_scanned": null,
  "message": "No scan data found. Run a scan at https://citerankscore.com to generate a score."
}

Error responses

StatusErrorMeaning
401Invalid or revoked API keyKey not found, wrong format, or key was revoked
400domain parameter requiredMissing domain query param
429Rate limit exceededDaily quota used up for your plan
405Method not allowedUse GET, not POST/PUT/etc.
GET /api/v1/history Weekly Citerank Score trend for a domain

Parameters

ParameterTypeRequiredDescription
domainstringRequiredDomain to query.
weeksintegerOptionalNumber of weekly data points to return. Default 12, max 52.

Response

{
  "success": true,
  "domain": "example.com",
  "weeks_requested": 12,
  "data_points": 8,
  "trend": { "first_score": 61, "latest_score": 74, "change": 13 },
  "history": [
    { "week_of": "2026-05-18", "score": 61, "grade": "C", "dimensions": { ... } },
    { "week_of": "2026-05-25", "score": 64, "grade": "C", "dimensions": { ... } }
  ]
}

History is ordered oldest → newest. trend.change is the point delta between the first and latest data points in the returned window — ideal for dashboards and Slack alerts.

GET /api/v1/citations Weekly AI citation trend for a domain

Parameters

ParameterTypeRequiredDescription
domainstringRequiredDomain to query.
weeksintegerOptionalNumber of weekly data points to return. Default 12, max 52.

Response

{
  "success": true,
  "domain": "example.com",
  "weeks_requested": 12,
  "data_points": 6,
  "trend": { "first_citations": 3, "latest_citations": 9, "change": 6 },
  "history": [
    { "week_of": "2026-06-01", "total_citations": 3, "domain_rank": 14, "appears_in_ai_answers": true }
  ]
}

Citation snapshots are recorded weekly by the Citation Tracker. domain_rank is your rank among all domains cited for your tracked queries that week.

GET /api/v1/scans List recent scans on your account

Parameters

ParameterTypeRequiredDescription
domainstringOptionalFilter scans to URLs containing this domain.
limitintegerOptionalPage size. Default 25, max 100.

Response

{
  "success": true,
  "count": 2,
  "scans": [
    {
      "url": "https://example.com/pricing",
      "title": "Pricing — Example",
      "score": 68,
      "grade": "C",
      "tool": "page_audit",
      "scanned_at": "2026-07-09T14:22:00.000Z"
    },
    {
      "url": "https://example.com",
      "title": "Example",
      "score": 74,
      "grade": "B",
      "tool": "site_audit",
      "scanned_at": "2026-07-08T09:10:00.000Z"
    }
  ]
}

tool identifies which Citerank tool produced the scan: page_audit, site_audit, citation_universe, and others as tools save history.

GET /api/v1/compare Side-by-side comparison of up to 5 domains

Parameters

ParameterTypeRequiredDescription
domainsstringRequiredComma-separated list of 2–5 domains (e.g. example.com,competitor.com).

Response

{
  "domains": [
    {
      "domain": "example.com",
      "score": 74,
      "grade": "B",
      "rank": 1,
      "dimensions": { "schemaEntity": 18, "discoverability": 20, "agenticProtocol": 14, "contentCitability": 15, "entityPresence": 7 },
      "last_scanned": "2026-07-15T10:00:00.000Z",
      "source": "snapshot"
    },
    {
      "domain": "competitor.com",
      "score": 61,
      "grade": "C",
      "rank": 2,
      "dimensions": { "schemaEntity": 12, "discoverability": 16, "agenticProtocol": 10, "contentCitability": 14, "entityPresence": 9 },
      "last_scanned": "2026-07-14T08:30:00.000Z",
      "source": "snapshot"
    }
  ],
  "summary": {
    "leader": "example.com",
    "leader_score": 74,
    "dimension_leaders": {
      "schemaEntity": "example.com",
      "discoverability": "example.com",
      "agenticProtocol": "example.com",
      "contentCitability": "example.com",
      "entityPresence": "competitor.com"
    },
    "domains_compared": 2,
    "domains_with_data": 2
  },
  "powered_by": "Citerank — AI Search Visibility",
  "docs": "https://citerankscore.com/docs/api.html"
}

Domains without scan data return score: null with a message and rank: null. Run a scan at citerankscore.com first to generate scores.

Code Examples

JavaScript / Node.js

const res = await fetch(
  'https://citerankscore.com/api/v1/score?domain=example.com',
  { headers: { 'Authorization': 'Bearer crk_live_your_key' } }
);
const data = await res.json();
console.log(`Score: ${data.score}/100 (Grade ${data.grade})`);

Python

import requests

resp = requests.get(
    'https://citerankscore.com/api/v1/score',
    params={'domain': 'example.com'},
    headers={'Authorization': 'Bearer crk_live_your_key'}
)
data = resp.json()
print(f"Score: {data['score']}/100  Grade: {data['grade']}")

Google Sheets (IMPORTDATA)

=IMPORTDATA("https://citerankscore.com/api/v1/score?domain=example.com&key=crk_live_YOUR_KEY&format=csv")

Append &format=csv to any endpoint to get a flat CSV row: domain,score,grade,last_scanned. Paste into Google Sheets IMPORTDATA to auto-refresh scores on open.

Looker Studio (Community Connector)

Use Looker Studio's built-in JSON/CSV URL data source with your endpoint URL and Bearer token in the header. Supports scheduled refresh. See Looker Studio docs →

Multi-domain Agency Report (Node.js)

const KEY = 'crk_live_your_key';
const clients = ['client1.com', 'client2.com', 'client3.com'];

const scores = await Promise.all(clients.map(domain =>
  fetch(`https://citerankscore.com/api/v1/score?domain=${domain}`, {
    headers: { Authorization: `Bearer ${KEY}` }
  }).then(r => r.json())
));

scores.forEach(d => {
  console.log(`${d.domain}: ${d.score ?? 'no data'}/100 (${d.grade ?? 'N/A'})`);
});

// Compare all clients head-to-head
const compare = await fetch(
  `https://citerankscore.com/api/v1/compare?domains=${clients.join(',')}`,
  { headers: { Authorization: `Bearer ${KEY}` } }
).then(r => r.json());
console.log('Leader:', compare.summary.leader, compare.summary.leader_score);

Embeddable Score Badge

No API key needed for the badge — it uses cached public scores and serves an SVG:

<img src="https://citerankscore.com/api/badge?domain=example.com"
     alt="Citerank AI Visibility Score">

<!-- Flat pill variant (good for GitHub READMEs) -->
<img src="https://citerankscore.com/api/badge?domain=example.com&style=flat"
     alt="Citerank Score">

Dimension Keys

KeyWhat it measuresSource
schemaEntityJSON-LD structured data quality, completeness, and entity alignment — Organization, WebSite, FAQ, BreadcrumbList, etc.Citerank Score
discoverabilityllms.txt presence and quality, robots.txt AI crawler config, XML sitemap coverage, and canonical hygieneCiterank Score
agenticProtocolA2A agent endpoint, WebMCP JSON, potentialAction schema, accessibility tree depth — readiness for AI agent interactionsCiterank Score
contentCitabilityPassage-level citability, E-E-A-T signals, FAQ presence, answer-shape density, and entity co-occurrenceCiterank Score
entityPresenceKnowledge graph signal strength, Wikidata alignment, sameAs coverage, and brand entity disambiguationCiterank Score

When source is "scan" (individual tool scan rather than a full Citerank Score run), dimension keys may vary by tool — e.g. a Schema Generator scan may return different keys than a Brand Intelligence scan. Use the source field to detect this.

Important: API keys provide access to your account's scan data. Never expose keys in client-side JavaScript or public repositories. Revoke and regenerate a key immediately if it is compromised.

Generate your API key → Manage keys in Settings → Developer API