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.