Programmatically run AI visibility audits, retrieve results, and get notified via webhooks. Audits measure how your brand appears across ChatGPT, Gemini, and Claude.
https://www.lucidrank.io/api/v1All API requests require a Bearer token in the Authorization header. Get your API key from Dashboard → Settings → API Keys.
curl https://www.lucidrank.io/api/v1/usage \
-H "Authorization: Bearer lr_live_your_key_here"API access requires a Pro plan or above. Free and Starter accounts cannot use the API.
API requests are rate-limited per key. Every response includes headers showing your current usage:
X-RateLimit-LimitMax requests per minuteX-RateLimit-RemainingRequests left in windowX-RateLimit-ResetUnix timestamp when window resetsPro: 30 req/min · Business: 60 req/min
Monthly audit quotas are shared between the web app and API. A global concurrency limit of 10 simultaneous audits applies system-wide.
/api/v1/auditsStart a new AI visibility audit. Returns immediately with the audit ID; processing happens in the background.
Request Body
domainstring*keywordsstring[]locationstringcurl -X POST https://www.lucidrank.io/api/v1/audits \
-H "Authorization: Bearer lr_live_..." \
-H "Content-Type: application/json" \
-d '{"domain": "example.com", "keywords": ["saas analytics"]}'{
"data": {
"id": "a1b2c3d4-...",
"domain": "example.com",
"status": "pending",
"created_at": "2026-02-28T12:00:00Z",
"status_url": "https://www.lucidrank.io/api/v1/audits/a1b2c3d4-..."
},
"meta": {
"request_id": "req_abc123",
"timestamp": "2026-02-28T12:00:00Z"
}
}/api/v1/audits/:idRetrieve audit details and results. Poll this endpoint to track progress.
Query Parameters
fieldsstringscore, score_breakdown, recommendations, ai_results, competitor_analysis, competitive_intelligence, keyword_opportunities, brand_perception, structured_data_audit, quick_wins, executive_summary, website_analysis# Full results
curl https://www.lucidrank.io/api/v1/audits/AUDIT_ID \
-H "Authorization: Bearer lr_live_..."
# Only score and recommendations
curl "https://www.lucidrank.io/api/v1/audits/AUDIT_ID?fields=score,recommendations" \
-H "Authorization: Bearer lr_live_..."/api/v1/auditsList your audits with pagination and optional filters.
statusstringdomainstringlimitnumberoffsetnumbercurl "https://www.lucidrank.io/api/v1/audits?status=completed&limit=10" \
-H "Authorization: Bearer lr_live_..."/api/v1/audits/:idCancel a pending audit. Only audits with status 'pending' can be cancelled.
curl -X DELETE https://www.lucidrank.io/api/v1/audits/AUDIT_ID \
-H "Authorization: Bearer lr_live_..."/api/v1/usageCheck your current quota and rate limit status.
{
"data": {
"subscription_tier": "pro",
"audits": {
"used": 12,
"limit": 25,
"remaining": 13
},
"rate_limit": {
"requests_per_minute": 30,
"remaining": 28,
"reset_at": "2026-02-28T12:01:00Z"
}
}
}Configure a webhook URL when creating your API key to receive notifications when audits complete or fail. The payload is signed with HMAC-SHA256 using your webhook secret.
{
"event": "audit.completed",
"audit": {
"id": "a1b2c3d4-...",
"domain": "example.com",
"status": "completed",
"visibility_score": 72,
"pure_visibility_score": 72,
"score_breakdown": { ... },
"created_at": "2026-02-28T12:00:00Z",
"completed_at": "2026-02-28T12:03:15Z"
},
"timestamp": "2026-02-28T12:03:15Z"
}Signature Verification
Verify the X-LucidRank-Signature header by computing HMAC-SHA256 of the raw request body using your webhook secret:
import { createHmac } from 'crypto';
function verifyWebhook(body, signature, secret) {
const expected = createHmac('sha256', secret)
.update(body)
.digest('hex');
return signature === expected;
}import hmac, hashlib
def verify_webhook(body: bytes, signature: str, secret: str) -> bool:
expected = hmac.new(
secret.encode(), body, hashlib.sha256
).hexdigest()
return hmac.compare_digest(signature, expected)All errors follow a consistent format with an error code and human-readable message:
{
"error": {
"code": "rate_limit_exceeded",
"message": "Rate limit exceeded. Retry after 30 seconds.",
"retry_after": 30
}
}| Code | Status | Description |
|---|---|---|
unauthorized | 401 | Invalid or missing API key |
forbidden | 403 | Insufficient permissions or plan |
not_found | 404 | Resource not found |
invalid_request | 400 | Bad request parameters |
rate_limit_exceeded | 429 | Too many requests |
monthly_limit_reached | 429 | Monthly audit quota used up |
domain_limit_reached | 403 | Domain limit for your plan |
invalid_state | 409 | Action not allowed in current state |
internal_error | 500 | Server error |
Need help? Contact support