v1

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.

Base URL: https://traffi.app/api/public/geo
All 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_abc123

Authorization header

GET /api/public/geo/v1/score?domain=notion.so
Authorization: Bearer tgeo_live_abc123

API keys look like tgeo_live_[48 random hex chars].

Get a free key →

Rate Limits

Limits are per API key, per day (UTC). Rate limit information is returned in response headers.

TierLimitPriceAttribution
Free100 req/day$0 foreverRequired
Researcher1,000 req/day$0 (.edu email)Academic citation req.
Agency10,000 req/day$99/moOptional
EnterpriseUnlimitedCustomWhite-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

Required for Free and Researcher tiers. Any public-facing UI that displays Traffi GEO data must include visible attribution. Agency and Enterprise tiers have no attribution requirement.

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.

StatusErrorMeaning
400domain parameter requiredMissing required query param
401API key requiredNo api_key or Authorization header
401Invalid API keyKey not found or typo
403This API key has been revokedKey disabled by admin
429Daily rate limit exceededQuota hit — see reset_at
500Internal server errorContact hello@traffi.app

Registration

POST /api/public/geo/register

Create a free API key. No account or credit card required. The plain key is returned once — save it.

Request Body

FieldTypeDescription
emailrequiredstringYour email. .edu emails auto-upgrade to Researcher tier (1,000 req/day).
nameoptionalstringYour 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

GET /api/public/geo/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

ParamTypeDescription
domainrequiredstringDomain to score. Strip protocol and path: notion.so, not https://notion.so/product.
api_keyrequired*stringYour 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>"
}
Unknown domains return "status": "queued" — the domain is added to the crawl queue and will be scored within 24 hours.

GET /v1/history

GET /api/public/geo/v1/history

Returns weekly GEO score history for a domain. Use to build trend charts and detect score changes.

ParamTypeDescription
domainrequiredstringDomain to fetch history for.
periodoptionalstringTime range: 30d, 90d (default), 180d, 365d.
api_keyrequired*stringYour 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

GET /api/public/geo/v1/leaderboard

Top N domains in a vertical or globally, ordered by GEO score. Max 100 per request.

ParamTypeDescription
verticaloptionalstringVertical name (e.g. SaaS, AITools). Omit for global leaderboard.
limitoptionalnumberNumber of results (1–100, default 50).
api_keyrequired*stringYour 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

GET /api/public/geo/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.

ParamTypeDescription
domainsrequiredstringComma-separated domain list (2–5). E.g. notion.so,linear.app,figma.com
api_keyrequired*stringYour 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

GET /api/public/geo/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

GET /api/public/geo/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.

TierDaily LimitPriceHow to Get
Free100 req/day$0Register with any email at /geo-api
Researcher1,000 req/day$0Auto-assigned for .edu / .ac.uk / .edu.au emails
Agency10,000 req/day$99/moContact hello@traffi.app
EnterpriseUnlimitedCustomContact hello@traffi.app

Each email gets one active API key. Registering again invalidates the previous key.

Changelog

2026-04-07
new Initial v1 release. Score, history, leaderboard, compare, verticals, stats endpoints. Free, Researcher, Agency, Enterprise tiers.