Traffi GEO API
Access GEO visibility scores for 10,000+ domains — ChatGPT, Perplexity, Claude, Gemini, and Grok. Free tier: 100 requests/day with attribution. All responses are JSON.
https://traffi.app/api/public/geoAll v1 endpoints:
https://traffi.app/api/public/geo/v1/{endpoint}
What is GEO?
GEO (Generative Engine Optimization) measures how visible a domain is across AI answer engines. A domain scores higher when it's frequently cited in ChatGPT, Perplexity, Claude, Gemini, and Grok responses. The Traffi GEO index crawls domains proactively and computes these scores using content analysis and proxy signals.
Authentication
All data endpoints require an API key. Pass it as a query parameter or in the Authorization header.
Query parameter (simplest)
GET /api/public/geo/v1/score?domain=notion.so&api_key=tgeo_live_abc123Authorization header
GET /api/public/geo/v1/score?domain=notion.so
Authorization: Bearer tgeo_live_abc123API keys look like tgeo_live_[48 random hex chars].
Rate Limits
Limits are per API key, per day (UTC). Rate limit information is returned in response headers.
| Tier | Limit | Price | Attribution |
|---|---|---|---|
| Free | 100 req/day | $0 forever | Required |
| Researcher | 1,000 req/day | $0 (.edu email) | Academic citation req. |
| Agency | 10,000 req/day | $99/mo | Optional |
| Enterprise | Unlimited | Custom | White-label OK |
Response headers
X-RateLimit-Limit: 100 X-RateLimit-Remaining: 87 X-RateLimit-Reset: 1744070400 // Unix timestamp of next reset (UTC midnight)
429 Rate Limit Exceeded
{
"success": false,
"error": "Daily rate limit exceeded (100 requests/day for free tier).",
"limit": 100,
"reset_at": "2026-04-08T00:00:00.000Z",
"upgrade": "https://traffi.app/geo-api"
}Attribution
Free and Researcher tier responses include ready-to-use attribution fields:
{
"attribution_required": true,
"attribution_text": "Powered by Traffi GEO — traffi.app",
"attribution_html": "<a href='https://traffi.app'>Powered by Traffi GEO</a>"
}Copy-paste the attribution_html into your UI. It must be visible to end users.
Errors
All errors return JSON with success: false and an error string.
| Status | Error | Meaning |
|---|---|---|
| 400 | domain parameter required | Missing required query param |
| 401 | API key required | No api_key or Authorization header |
| 401 | Invalid API key | Key not found or typo |
| 403 | This API key has been revoked | Key disabled by admin |
| 429 | Daily rate limit exceeded | Quota hit — see reset_at |
| 500 | Internal server error | Contact hello@traffi.app |
Registration
Create a free API key. No account or credit card required. The plain key is returned once — save it.
Request Body
| Field | Type | Description |
|---|---|---|
| emailrequired | string | Your email. .edu emails auto-upgrade to Researcher tier (1,000 req/day). |
| nameoptional | string | Your name (max 100 chars). Used in admin dashboard only. |
# cURL example
curl -X POST https://traffi.app/api/public/geo/register \
-H "Content-Type: application/json" \
-d '{"email": "dev@example.com", "name": "Jane Dev"}'// Response { "success": true, "api_key": "tgeo_live_a1b2c3d4...", // SAVE THIS — shown once only "key_prefix": "tgeo_live_a1b2", "email": "dev@example.com", "tier": "free", "daily_limit": 100, "attribution_required": true, "message": "Free tier activated (100 req/day). Attribution required.", "docs": "https://traffi.app/geo-api/docs", "note": "Save your API key — it will not be shown again." }
GET /v1/score
Returns the current GEO score for a domain: overall score, per-engine breakdown, vertical classification, global and vertical rank, and last crawl timestamp.
Query Parameters
| Param | Type | Description |
|---|---|---|
| domainrequired | string | Domain to score. Strip protocol and path: notion.so, not https://notion.so/product. |
| api_keyrequired* | string | Your API key. *Or use Authorization header. |
GET /api/public/geo/v1/score?domain=notion.so&api_key=YOUR_KEY
{
"api_version": "v1",
"domain": "notion.so",
"geo_score": 74,
"engines": {
"chatgpt": 82,
"perplexity": 71,
"claude": 68,
"gemini": 73,
"grok": 76
},
"vertical": "SaaS",
"global_rank": 142,
"vertical_rank": 23,
"status": "completed",
"last_updated": "2026-04-07T00:00:00.000Z",
"powered_by": "Traffi GEO Index — traffi.app",
"attribution_required": true,
"attribution_html": "<a href='https://traffi.app'>Powered by Traffi GEO</a>"
}"status": "queued" — the domain is added to the crawl queue and will be scored within 24 hours.
GET /v1/history
Returns weekly GEO score history for a domain. Use to build trend charts and detect score changes.
| Param | Type | Description |
|---|---|---|
| domainrequired | string | Domain to fetch history for. |
| periodoptional | string | Time range: 30d, 90d (default), 180d, 365d. |
| api_keyrequired* | string | Your API key. |
GET /api/public/geo/v1/history?domain=notion.so&period=90d&api_key=YOUR_KEY
{
"api_version": "v1",
"domain": "notion.so",
"period": "90d",
"data_points": 13,
"history": [
{ "week": "2026-01-05", "score": 68 },
{ "week": "2026-01-12", "score": 71 },
// ...
],
"powered_by": "Traffi GEO Index — traffi.app"
}GET /v1/leaderboard
Top N domains in a vertical or globally, ordered by GEO score. Max 100 per request.
| Param | Type | Description |
|---|---|---|
| verticaloptional | string | Vertical name (e.g. SaaS, AITools). Omit for global leaderboard. |
| limitoptional | number | Number of results (1–100, default 50). |
| api_keyrequired* | string | Your API key. |
GET /api/public/geo/v1/leaderboard?vertical=SaaS&limit=10&api_key=YOUR_KEY
{
"api_version": "v1",
"vertical": "SaaS",
"count": 10,
"results": [
{
"rank": 1,
"domain": "notion.so",
"geo_score": 91,
"engines": { "chatgpt": 95, "perplexity": 88, ... },
"vertical": "SaaS",
"last_updated": "2026-04-07T00:00:00.000Z"
}
],
"powered_by": "Traffi GEO Index — traffi.app"
}GET /v1/compare
Side-by-side GEO comparison for 2–5 domains. Returns a leader field (highest-scoring domain) plus full score objects for each domain.
| Param | Type | Description |
|---|---|---|
| domainsrequired | string | Comma-separated domain list (2–5). E.g. notion.so,linear.app,figma.com |
| api_keyrequired* | string | Your API key. |
GET /api/public/geo/v1/compare?domains=notion.so,linear.app,figma.com&api_key=YOUR_KEY
{
"api_version": "v1",
"count": 3,
"leader": "figma.com",
"comparison": [
{ "domain": "notion.so", "geo_score": 74, "engines": {...}, ... },
{ "domain": "linear.app", "geo_score": 68, "engines": {...}, ... },
{ "domain": "figma.com", "geo_score": 86, "engines": {...}, ... }
],
"powered_by": "Traffi GEO Index — traffi.app"
}GET /v1/verticals
Lists all vertical categories in the GEO index with domain counts and average scores. Use these values for the vertical parameter in /leaderboard.
GET /api/public/geo/v1/verticals?api_key=YOUR_KEY
{
"api_version": "v1",
"count": 12,
"verticals": [
{ "vertical": "SaaS", "domain_count": 1840, "avg_score": 64 },
{ "vertical": "AITools", "domain_count": 920, "avg_score": 71 },
{ "vertical": "Cybersecurity", "domain_count": 340, "avg_score": 58 },
// ...
],
"powered_by": "Traffi GEO Index — traffi.app"
}GET /v1/stats
Returns index health metrics: total domains, public domains, average score, vertical distribution, and API version.
GET /api/public/geo/v1/stats?api_key=YOUR_KEY
{
"api_version": "v1",
"total_domains": 12840,
"public_domains": 10200,
"completed": 9880,
"avg_score": 62,
"by_vertical": [
{ "vertical_category": "SaaS", "count": "1840", "avg_score": "64" }
],
"last_updated": "2026-04-07T09:52:05.000Z",
"powered_by": "Traffi GEO Index — traffi.app"
}Tiers & Pricing
Upgrading to Agency or Enterprise unlocks higher limits and removes the attribution requirement.
| Tier | Daily Limit | Price | How to Get |
|---|---|---|---|
| Free | 100 req/day | $0 | Register with any email at /geo-api |
| Researcher | 1,000 req/day | $0 | Auto-assigned for .edu / .ac.uk / .edu.au emails |
| Agency | 10,000 req/day | $99/mo | Contact hello@traffi.app |
| Enterprise | Unlimited | Custom | Contact hello@traffi.app |
Each email gets one active API key. Registering again invalidates the previous key.