REST API
Ask five AI engines about your site over HTTP. One key, sixteen endpoints plus GET /me, JSON in and out, with a full response example for each call.
The same seven calls as the MCP server, over HTTP. For scripts, cron jobs and anything that is not an MCP client.
Prefer to click than to curl? The playground runs any of these endpoints from your browser and shows you the exact request to copy.
Base URL and auth
https://geondex.com/api/v1Create a key on your account page and send it on every request as a bearer token. An X-API-Key: gx_… header works too. Details: Authentication.
curl -s https://geondex.com/api/v1/me -H "Authorization: Bearer gx_YOUR_KEY"POST bodies are JSON and need content-type: application/json. GET calls take query parameters.
Endpoints
| Endpoint | Reference | What it does | Cost |
|---|---|---|---|
GET /api/v1/me | me | Your key, the engines available, and your credit balance | Free |
POST /api/v1/check | check_visibility | Ask five AI engines whether your domain is cited, right now | 2–64 credits / engine, by model |
POST /api/v1/why-not-cited | why_not_cited | Why AI engines cite other pages instead of URL, and what to change | 20 credits + a check if none in 24 h |
POST /api/v1/answers | ai_answers | The full answer each AI engine gives to a prompt, with its sources | 2–64 credits / engine, by model |
POST /api/v1/mentions | ai_mentions | Real AI answers that mention your brand or cite your site | 35 credits |
POST /api/v1/citations | ai_citations | The pages and domains AI answers cite when they mention you | 35 credits |
GET /api/v1/history | history | Your stored record of past checks for your domain | Free |
POST /api/v1/prompts/suggest | suggest_prompts | Buyer-intent questions to check your domain against | 1 credit |
POST /api/v1/rank | google_rank | Google position for a keyword, plus AI Overview presence | 1 credit |
POST /api/v1/volume | keyword_volume | Monthly search volume for up to 1,000 keywords | 1 / 10 keywords, min 20 |
POST /api/v1/ai-volume | ai_keyword_volume | Monthly AI search volume for up to 1,000 keywords | 1 / 10 keywords, min 5 |
POST /api/v1/keyword-ideas | keyword_ideas | Keyword ideas for a seed phrase, with volume, difficulty and intent | 7 credits |
POST /api/v1/ranked-keywords | ranked_keywords | The keywords a domain ranks for on Google, by traffic | 7 credits |
POST /api/v1/domain-overview | domain_overview | A domain's Google keywords, traffic and position spread | 3 credits |
POST /api/v1/backlinks | backlinks | Backlinks, referring domains, authority rank and spam score | 7 credits |
GET /api/v1/crawlers | check_crawlers | Whether robots.txt blocks the crawlers that cite you | Free |
POST /api/v1/audit | audit_page | Grade one URL's structured data for AI citation | 1 credit |
GET /api/v1/usage | usage | Credits left, spend per tool this cycle, and your recent calls | Free |
Requests and responses
Every tool response is { summary, data, credits: { charged, remaining } }: a one-line summary an agent can repeat, the full data, and what the call cost. On a free call charged is 0 and remaining is null.
Each endpoint page above has one real-shaped request and response. Field names and types are exactly what the API returns: every example is parsed through the tool's own output schema by a test. Full prices are on /pricing and in Credits & pricing rules.
Machine-readable spec: /api/v1/openapi.json (OpenAPI 3.1, no key needed).
Handy one-liners
# Who cites me, and who is cited instead?
curl -s https://geondex.com/api/v1/check -H "Authorization: Bearer gx_…" -H "content-type: application/json" -d '{"domain":"ttsensei.com","prompt":"best table tennis blade for beginners"}' | jq '.summary, .data.citedInstead'
# What did I check before, and what did it say?
curl -s "https://geondex.com/api/v1/history?domain=ttsensei.com" -H "Authorization: Bearer gx_…" | jq '.data.batches[0]'
# Google rank next to the AI answer
curl -s https://geondex.com/api/v1/rank -H "Authorization: Bearer gx_…" -H "content-type: application/json" -d '{"keyword":"best table tennis blade for beginners","domain":"ttsensei.com"}' | jq .summaryErrors
Every error has the same body, so branch on error.code, not on the message:
{"error":{"code":"credits_exhausted","message":"This call needs 57 credits; you have 5. …"}}A call that returns an error is not charged. Every code and what to do: Errors & rate limits.
Prefer your agent to call these itself? Install the MCP server.