# AI Search Visibility API (GEO) — measure a website's AI citability: AI-crawler access (robots.txt), llms.txt, schema.org structured data and meta signals → a 0-100 AI-readiness score with ranked fixes

> Full AI-readiness report for a URL: AI-crawler access map + llms.txt + schema + meta + 0-100 score + ranked fix recommendations. One call, everything.
> ReefAPI engine `geo-intel` · 6 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/geo-intel/v1/<action>` with a JSON body.
- **Auth:** header `x-api-key: <YOUR_REEFAPI_KEY>` — create one free (1,000 credits, no card): https://reefapi.com/signup
- **Response (every call):** `{ ok: boolean, data: ..., meta: { record_count, credits, ... }, error: { code, message } }` — branch on `ok`. Failed or blocked calls are free.
- **One key + one shared credit pool** across every ReefAPI API. Per-call credits are listed on each endpoint below.
- **Use it from an AI agent (MCP):** connect `https://api.reefapi.com/mcp` (remote streamable-http, `Authorization: Bearer <key>`) and your assistant can call these actions directly.

## Endpoints

### POST /geo-intel/v1/check — 1 credit
Full AI-readiness report for a URL: AI-crawler access map + llms.txt + schema + meta + 0-100 score + ranked fix recommendations. One call, everything.

**Parameters:**
- `url` (string, required) — The site to analyse. Accepts a full URL (https://example.com/page) or a bare domain (example.com → https:// assumed). Only http/https; private/internal/metadata targets are SSRF-blocked. Alias: domain.
- `path` (string, optional, default "/") — The path to evaluate robots.txt access against (default '/'). Use a real content path (e.g. /blog/post) to test whether AI bots may fetch THAT page.
- `bots` (array, optional) — Optional subset of AI-bot tokens to report (comma-separated or array). Omit for the full 50+ bot map. Unknown tokens are still checked against robots.txt verbatim.
- `follow_redirects` (boolean, optional, default true) — Follow redirects (e.g. http→https, apex→www) before analysing the final URL (default true). Each hop is independently SSRF-validated.

**Returns:** url, final_url, score{score,grade,breakdown,recommendations}, ai_crawlers{bots[],summary}, llms_txt{present,valid,sections,links}, structured_data{types,citable_types,...}, meta{canonical,og,robots_meta,...}, extractability{text_ratio,likely_js_app}, sitemaps[]

**Example request body:**
```json
{
  "url": "https://docs.anthropic.com"
}
```

### POST /geo-intel/v1/crawlers — 1 credit
AI-crawler access map from robots.txt: per-bot allow/block (Google longest-match), operator, AI engine, purpose (search/training/agent), crawl-delay, sitemaps.

**Parameters:**
- `url` (string, required) — The site to analyse. Accepts a full URL (https://example.com/page) or a bare domain (example.com → https:// assumed). Only http/https; private/internal/metadata targets are SSRF-blocked. Alias: domain.
- `path` (string, optional, default "/") — The path to evaluate robots.txt access against (default '/'). Use a real content path (e.g. /blog/post) to test whether AI bots may fetch THAT page.
- `bots` (array, optional) — Optional subset of AI-bot tokens to report (comma-separated or array). Omit for the full 50+ bot map. Unknown tokens are still checked against robots.txt verbatim.

**Returns:** robots_status, bots[] (token, operator, engine, category, allowed, rule, critical, cites), summary{total,allowed,blocked,critical_blocked}, blanket_block_all, sitemaps[], crawl_delays{}, parse_errors[]

**Example request body:**
```json
{
  "url": "https://www.nytimes.com"
}
```

### POST /geo-intel/v1/llms_txt — 1 credit
Detect + parse + validate /llms.txt (and /llms-full.txt) — the emerging AI-context standard. Content-type sniffed so an HTML 404 can't masquerade as a real file.

**Parameters:**
- `url` (string, required) — The site to analyse. Accepts a full URL (https://example.com/page) or a bare domain (example.com → https:// assumed). Only http/https; private/internal/metadata targets are SSRF-blocked. Alias: domain.

**Returns:** llms_txt{present,valid,title,sections[],links_sample[],findings[],bytes}, llms_full_txt{present,bytes}, recommendations[]

**Example request body:**
```json
{
  "url": "https://stripe.com"
}
```

### POST /geo-intel/v1/schema — 1 credit
Extract and classify schema.org structured data (JSON-LD and @graph) for AI citability signals: Organization, Article, FAQ, BreadcrumbList, Product, Speakable — plus microdata and RDFa presence.

**Parameters:**
- `url` (string, required) — The site to analyse. Accepts a full URL (https://example.com/page) or a bare domain (example.com → https:// assumed). Only http/https; private/internal/metadata targets are SSRF-blocked. Alias: domain.
- `follow_redirects` (boolean, optional, default true) — Follow redirects (e.g. http→https, apex→www) before analysing the final URL (default true). Each hop is independently SSRF-validated.

**Returns:** structured_data{jsonld_blocks,types[],citable_types[],high_value_types[],has_organization,has_article,has_faq,has_breadcrumb,has_speakable,has_microdata,has_rdfa}, recommendations[]

**Example request body:**
```json
{
  "url": "https://www.nytimes.com"
}
```

### POST /geo-intel/v1/score — 1 credit
Composite AI-readiness score (0-100) + transparent per-pillar breakdown (crawler_access 40 / structured_data 25 / llms_txt 15 / meta 12 / crawlability 8) + ranked recommendations.

**Parameters:**
- `url` (string, required) — The site to analyse. Accepts a full URL (https://example.com/page) or a bare domain (example.com → https:// assumed). Only http/https; private/internal/metadata targets are SSRF-blocked. Alias: domain.
- `path` (string, optional, default "/") — The path to evaluate robots.txt access against (default '/'). Use a real content path (e.g. /blog/post) to test whether AI bots may fetch THAT page.
- `follow_redirects` (boolean, optional, default true) — Follow redirects (e.g. http→https, apex→www) before analysing the final URL (default true). Each hop is independently SSRF-validated.

**Returns:** score, grade (A-F), breakdown{pillar:{score,max}}, recommendations[] (priority, pillar, points_recoverable, fix), signals{} (the raw inputs)

**Example request body:**
```json
{
  "url": "https://github.com"
}
```

### POST /geo-intel/v1/batch — 1 credit
Score up to 20 sites concurrently in one call (each independently SSRF-guarded). Returns a compact score+grade per URL.

**Parameters:**
- `urls` (array, required) — List of sites to score in one call (max 20); each is independently SSRF-guarded and fetched concurrently.

**Returns:** results[] (url, ok, score, grade, critical_blocked[], llms_txt_present, has_structured_data) , count, ok_count

**Example request body:**
```json
{
  "urls": [
    "https://stripe.com",
    "https://github.com"
  ]
}
```

## More
- Try it live, no code: https://reefapi.com/playground?engine=geo-intel
- Human docs page: https://reefapi.com/docs/geo-intel
- Every ReefAPI API in one file (for your AI): https://reefapi.com/llms-full.txt
