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.
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 limit headers are returned on every response: X-RateLimit-Limit, X-RateLimit-Remaining. Limits reset at midnight UTC.
| Parameter | Type | Required | Description |
|---|---|---|---|
| domain | string | Required | Domain to query. Protocol is optional — example.com and https://example.com both work. |
{
"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).
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."
}
| Status | Error | Meaning |
|---|---|---|
| 401 | Invalid or revoked API key | Key not found, wrong format, or key was revoked |
| 400 | domain parameter required | Missing domain query param |
| 429 | Rate limit exceeded | Daily quota used up for your plan |
| 405 | Method not allowed | Use GET, not POST/PUT/etc. |
| Parameter | Type | Required | Description |
|---|---|---|---|
| domain | string | Required | Domain to query. |
| weeks | integer | Optional | Number of weekly data points to return. Default 12, max 52. |
{
"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.
| Parameter | Type | Required | Description |
|---|---|---|---|
| domain | string | Required | Domain to query. |
| weeks | integer | Optional | Number of weekly data points to return. Default 12, max 52. |
{
"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.
| Parameter | Type | Required | Description |
|---|---|---|---|
| domain | string | Optional | Filter scans to URLs containing this domain. |
| limit | integer | Optional | Page size. Default 25, max 100. |
{
"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.
| Parameter | Type | Required | Description |
|---|---|---|---|
| domains | string | Required | Comma-separated list of 2–5 domains (e.g. example.com,competitor.com). |
{
"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.
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})`);
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']}")
=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.
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 →
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);
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">
| Key | What it measures | Source |
|---|---|---|
| schemaEntity | JSON-LD structured data quality, completeness, and entity alignment — Organization, WebSite, FAQ, BreadcrumbList, etc. | Citerank Score |
| discoverability | llms.txt presence and quality, robots.txt AI crawler config, XML sitemap coverage, and canonical hygiene | Citerank Score |
| agenticProtocol | A2A agent endpoint, WebMCP JSON, potentialAction schema, accessibility tree depth — readiness for AI agent interactions | Citerank Score |
| contentCitability | Passage-level citability, E-E-A-T signals, FAQ presence, answer-shape density, and entity co-occurrence | Citerank Score |
| entityPresence | Knowledge graph signal strength, Wikidata alignment, sameAs coverage, and brand entity disambiguation | Citerank 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.