Developers

The SeeGeo API

Everything the web audit does, as JSON: start an AI-visibility audit of any domain, poll it, read the graded report with every finding, and check which AI crawlers can reach a site. Built for scripts and for agents — the OpenAPI 3.1 description loads as a tool definition.

Get a key

Sign in, open your account, and create a key under API. It is shown once. Send it as a bearer token on every request. Keys can be revoked there at any time; audits they started stay on your account.

Run an audit

Audits are asynchronous. Start one:

curl -X POST https://see-geo.com/api/v1/audits \
  -H "Authorization: Bearer $SEEGEO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"domain": "example.com"}'

You get 202 and the audit to poll:

{
  "id": "6f1c0d2e-3b4a-4c5d-8e9f-0a1b2c3d4e5f",
  "domain": "example.com",
  "status": "queued",
  "progress": { "phase": "queued", "note": null, "done": 0, "total": 0 },
  "summary": null,
  "links": {
    "self": "https://see-geo.com/api/v1/audits/6f1c0d2e-…",
    "html": "https://see-geo.com/audits/6f1c0d2e-…",
    "share": null
  },
  "usage": { "used": 1, "limit": 10 }
}

Poll every few seconds until status is done:

curl https://see-geo.com/api/v1/audits/6f1c0d2e-3b4a-4c5d-8e9f-0a1b2c3d4e5f \
  -H "Authorization: Bearer $SEEGEO_API_KEY"
{
  "id": "6f1c0d2e-…",
  "status": "done",
  "summary": {
    "seoScore": 71, "geoScore": 64, "combined": 67, "grade": "C",
    "gated": false, "ungraded": null, "walled": null,
    "engineVersion": "1.8.1",
    "categories": [
      { "category": "access", "label": "AI crawler access", "score": 100, "evaluated": true },
      { "category": "extractability", "label": "Content extractability", "score": 48, "evaluated": true },
      …
    ],
    "findingCount": 14
  },
  "report": { … every finding with severity, evidence and fix … }
}

summary is the grade and category scores; report is the full report the web page renders, findings included. Add ?report=0 to poll without the report body. A second audit of the same domain from the same account within ten minutes returns the first with 200 and deduplicated: true rather than crawling again.

Check crawler access

Synchronous, a few seconds: robots.txt read for each of the 14 AI crawlers, then the homepage fetched as GPTBot, OAI-SearchBot, ClaudeBot and PerplexityBot to see what a bot wall does.

curl "https://see-geo.com/api/v1/crawler-check?domain=example.com" \
  -H "Authorization: Bearer $SEEGEO_API_KEY"

From Python

import os, time, requests

KEY = os.environ["SEEGEO_API_KEY"]
H = {"Authorization": f"Bearer {KEY}"}

r = requests.post("https://see-geo.com/api/v1/audits", headers=H, json={"domain": "example.com"})
audit = r.json()
while audit["status"] in ("queued", "running"):
    time.sleep(4)
    audit = requests.get(audit["links"]["self"], headers=H).json()

print(audit["summary"]["grade"], audit["summary"]["combined"])
for f in audit["report"]["findings"]:
    print(f["severity"], f["title"])

Use it from an AI agent (MCP)

The same tools are exposed over the Model Context Protocol, so Claude Desktop, Claude Code, Cursor and any MCP client can audit a site mid-conversation. Two ways in, one key:

Remote, no install — the server at https://see-geo.com/mcp with the key as a bearer token:

claude mcp add --transport http seegeo https://see-geo.com/mcp \
  --header "Authorization: Bearer $SEEGEO_API_KEY"

Local — the seegeo-mcp package on npm (MIT, source in the repo):

# Claude Code
claude mcp add seegeo -e SEEGEO_API_KEY=sg_… -- npx -y seegeo-mcp

# Claude Desktop / Cursor (claude_desktop_config.json, .cursor/mcp.json)
{
  "mcpServers": {
    "seegeo": { "command": "npx", "args": ["-y", "seegeo-mcp"], "env": { "SEEGEO_API_KEY": "sg_…" } }
  }
}

Tools: audit_site (full graded audit, waits for the result), get_audit, crawler_check, list_audits, usage. Each returns a readable summary plus structured JSON; the same limits as the REST API apply.

Limits

Errors

Every error is JSON with a stable code: missing_key, invalid_key (401), invalid_domain (422), rate_limited and monthly_cap (429, with Retry-After where it applies), not_found (404), busy (503).

What is audited

The same engine and rubric as the site, documented on the methodology page: six categories scored 0–100, a grade calibrated against 107 real small-business sites, and a report where every finding says what was measured and how to fix it. The engine version is in every report.

Frequently asked questions

Is the SeeGeo API free?

Every plan includes API access. The free plan allows 10 API audits a month, Starter 100, Growth 500, Done-For-You 1000. Crawler checks and polling do not count against the audit cap.

How long does an API audit take?

Most finish in 20 to 40 seconds. The POST returns immediately with an id; poll GET /api/v1/audits/{id} every few seconds until status is done, then read summary and report.

Can an AI agent use the SeeGeo API?

Yes — that is what it is for. The OpenAPI 3.1 description at /openapi.json can be loaded as a tool definition by agent frameworks; responses are plain JSON with stable field names, and errors carry a machine-readable code.

Does SeeGeo have an MCP server?

Yes. A remote one at https://see-geo.com/mcp (Streamable HTTP, bearer key) and a local one on npm as seegeo-mcp. Both expose audit_site, get_audit, crawler_check, list_audits and usage to Claude Desktop, Claude Code, Cursor and any MCP client.

What does the API audit measure?

The same six categories as the web audit: access for 14 AI crawlers, technical foundation, structured data, content extractability, off-site presence and entity clarity, each scored 0–100 and combined into a grade calibrated against 107 real small-business websites.