Rank Tracking API
The rank tracking service syncs keyword rankings from VisibilityIQ’s data index into the organic_keywords_current and organic_overview_history tables. These are accessible via the API once a sync has completed.
Getting current rankings
Section titled “Getting current rankings”curl "https://visibilityiq365.com/api/v1/projects/proj_abc123/organic/keywords?domain=example.com&database=us" \ -H "Authorization: Bearer vis_live_YOUR_KEY_HERE"Response:
{ "ok": true, "data": { "domain": "example.com", "database": "us", "lastSyncAt": "2026-06-14T08:00:00Z", "total": 1247, "keywords": [ { "keyword": "site audit tool", "keywordHash": "a3f2...", "position": 4, "previousPosition": 6, "positionChange": -2, "searchVolume": 2400, "cpc": 8.50, "url": "https://example.com/features/site-audit", "intent": "commercial", "isBranded": false, "trafficEstimate": 312 } ] }}Note: positionChange is current minus previous (positive = dropped, negative = improved).
Filtering keywords
Section titled “Filtering keywords”# Only keywords in positions 1-10curl "https://visibilityiq365.com/api/v1/projects/proj_abc123/organic/keywords?domain=example.com&positionMin=1&positionMax=10"
# Only non-branded transactional keywordscurl "https://visibilityiq365.com/api/v1/projects/proj_abc123/organic/keywords?branded=false&intent=transactional"
# Keywords that improved since last synccurl "https://visibilityiq365.com/api/v1/projects/proj_abc123/organic/keywords?positionChangeLt=0"Getting position history
Section titled “Getting position history”curl "https://visibilityiq365.com/api/v1/projects/proj_abc123/organic/history?domain=example.com&database=us" \ -H "Authorization: Bearer vis_live_YOUR_KEY_HERE"Response shows daily rows for the last 90 days, then weekly Monday snapshots beyond that (history compression per the organic rankings data retention rules).
Keyword gap data (landscape)
Section titled “Keyword gap data (landscape)”The keyword landscape table shows how your keyword footprint compares to competitors:
curl "https://visibilityiq365.com/api/v1/projects/proj_abc123/landscape?domain=example.com" \ -H "Authorization: Bearer vis_live_YOUR_KEY_HERE"Gap types:
| Gap Type | Meaning |
|---|---|
missing | Competitor ranks, you don’t |
weak | You rank 50+, competitor ranks in top 10 |
competitive | Both rank in top 20 |
dominant | You rank top 10, competitor doesn’t |
opportunity | High volume, low competition |
uncontested | Only you rank; competitor has no presence |
Triggering a manual sync
Section titled “Triggering a manual sync”curl -X POST "https://visibilityiq365.com/api/v1/projects/proj_abc123/organic/sync" \ -H "Authorization: Bearer vis_live_YOUR_KEY_HERE" \ -H "Content-Type: application/json" \ -d '{"domain": "example.com", "database": "us"}'Manual syncs consume units from your monthly budget. Check remaining budget before triggering:
curl "https://visibilityiq365.com/api/v1/projects/proj_abc123/organic/settings" \ -H "Authorization: Bearer vis_live_YOUR_KEY_HERE"Response includes monthlyUnitBudget, unitsConsumedThisMonth, syncStatus.
Intent classification
Section titled “Intent classification”The intent field uses the rank-tracking service’s intent bitmask mapped to a simplified four-value enum:
| Value | Description |
|---|---|
informational | User seeking information (“how to…”) |
navigational | User looking for a specific site |
commercial | User comparing options before purchase |
transactional | User ready to buy or act |
Multi-intent keywords (where the bitmask has multiple bits set) are classified by the highest commercial intent present — a keyword that’s both informational and transactional is stored as transactional.