← back to scanner
API · DEVELOPER · CI

Answena isn't a dashboard.
It's an API for AI-citation diagnostics.

Other GEO tools build dashboards humans stare at. Answena is built for the layer below: agents that write content, CI pipelines that publish it, and IDEs where it gets edited. Score a page in 3 seconds, before it goes live.

Get an API key → Full API reference

Why an API, not a dashboard

By the time you're staring at "this week your visibility dropped 4%", the damage is published. Answena scores a page before publish, returns the same JSON to a human, an IDE plugin, or an autonomous agent. One score, one source of truth, embedded in your build.

Three places to plug it in

01 / CI

Lint your content

Run POST /api/v1/free-scan in GitHub Actions. Fail the build if the page drops below score 60. Block bad publishes the same way you block bad TypeScript.

02 / AGENT

Let your AI grade itself

An agent writes a draft → calls Answena → reads the cluster deltas → rewrites the weakest section. Closed-loop content optimization. The agent never publishes a sub-70 draft.

03 / IDE

Score on save

VSCode / Cursor / WordPress plugin: render Answena's score next to the editor. See your citability change as you type. No more "publish, wait a week, check Otterly."

Quickstart — score a URL in 30 seconds

No signup, no API key, no rate-limit ceremony for the basic scan. Hit /api/v1/free-scan and you get back a complete report.

# No auth needed for the free tier.
curl -X POST https://answena.com/api/v1/free-scan \
  -H "Content-Type: application/json" \
  -d '{"url": "https://yourdomain.com/landing"}'
const r = await fetch('https://answena.com/api/v1/free-scan', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ url: 'https://yourdomain.com/landing' })
});
const { result } = await r.json();
console.log(`Score: ${result.score}/100`);
// → Score: 73/100
import requests
r = requests.post(
    "https://answena.com/api/v1/free-scan",
    json={"url": "https://yourdomain.com/landing"},
)
print(f"Score: {r.json()['result']['score']}/100")

What you get back

{
  "ok": true,
  "result": {
    "score": 73,                  // 0-100 composite
    "grade": "B",
    "clusters": { ... },          // 10 cluster scores
    "hardFilters": { ... },       // pass / fail + reasons
    "fixes": [ ... ],             // ranked actions
    "platformScores": {
      "chatgpt": 76, "claude": 71,
      "gemini": 68,  "perplexity": 79,
      "aio": 72
    }
  }
}

Pricing

Honest baseline: the engine is open and free for anyone scoring their own pages. Quotas exist to keep one operator from melting the box for everyone else.

Free
$0/mo

Public, no auth. Perfect for individual devs and CI experiments.

  • Unlimited POST /api/v1/free-scan
  • Deterministic mode (cached, fast)
  • Full report JSON
  • 5/min throttle (network-fair)
Read docs
Scale
Custom

Higher limits, dedicated probe panel, SLA. Talk to us.

  • 10K+ calls/day
  • Extended LLM probe panel
  • Custom cluster weights
  • Priority support
  • Hosted or self-hosted
Contact us

Endpoints (snapshot)

Full reference at /docs.

POST /api/v1/free-scan No auth. Score one URL.
POST /api/v1/sync/onboard Get an API key for a domain.
POST /api/v1/connect Auth. Live scan + personalised fixes.
GET /api/v1/quota Auth. Current usage + limit.
POST /api/v1/sync/webhook Auth. HMAC-signed webhook for findings.
GET /api/health Provider availability snapshot.

What stays stable, what doesn't

Stable forever: /api/v1/* endpoint paths and field names. X-AISEO-Key header. The 0-100 score scale.

May evolve: additional fields in responses (additive only — your code never breaks). Cluster weights re-train against ground truth. Optional Claude-augmented payloads behind feature flags.

Versioned: any breaking change ships under /api/v2/*. v1 stays online for 12 months minimum after v2 ships.

Get an API key

Two options:

  1. Hit POST /api/v1/sync/onboard with { url, name } — you get back { site_id, api_key } instantly. Save the key, it's only shown once.
  2. Or just use POST /api/v1/free-scan without any key — works for the public diagnostic.

Onboard now → Try the scanner