Check SEO and GEO visibility for a keyword
Check where a domain ranks in Google, whether AI answers (Google AI Mode, Google AI Overview, ChatGPT) mention or cite it, search volume, and backlink strength.
GEO here means generative engine optimization: whether an AI answer mentions or cites your domain, next to the classic SEO question of where you rank in search results. This walks through five jobs that together answer both.
What it costs
google.serp.organic and google.keywords.volume and the AI-answer jobs each price differently,
and google.keywords.volume in particular is priced much higher than a results page. Quote each
one before you run it:
search {"filters": {"capability": "google.serp.organic"}, "prefer": "cheapest"}
On 2026-09-28 the cheapest listed prices were google.serp.organic around $0.0019 per call,
google.serp.ai-mode around $0.002 per call, google.keywords.volume around $0.09 per call, and
backlinks.domain.summary around $0.024 per call on its one provider. Read the live numbers and
check balance before running the whole set on a list of keywords.
Google results
google.serp.organic takes query, and optionally location, language, country and device:
run {"endpointId": "job:google.serp.organic", "input": {"query": "best crm for startups", "location": "United States"}, "idempotencyKey": "geo-crm-organic", "fallback": true}curl -s "https://api.looot.ai/v1/runs?wait=20" \
-H "Authorization: Bearer $LOOOT_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"endpointId": "job:google.serp.organic",
"input": {"query": "best crm for startups", "location": "United States"},
"idempotencyKey": "geo-crm-organic",
"fallback": true
}'looot run job:google.serp.organic \
--input '{"query": "best crm for startups", "location": "United States"}' \
--waitRead result for the ranked list and find your domain’s position, if it appears at all.
AI answers: AI Mode, AI Overview, ChatGPT
These three, google.serp.ai-mode, search.google-ai-overview and search.chatgpt, are each
served by one provider today, so search for the job, inspect the endpoint it returns, and send that
endpoint’s own required fields. Don’t guess a shared input name:
search {"filters": {"capability": "search.chatgpt"}}inspect {"endpointId": "<endpointId from that search>", "detail": "run"}inspect returns requiredInputFields, inputSchema and a run template with the exact field
names that endpoint takes. Fill in the placeholders and run it with your own idempotencyKey.
Repeat for google.serp.ai-mode and search.google-ai-overview.
Read each answer’s text from result and check whether it names or links your brand and domain.
Search volume for the keyword
google.keywords.volume is priced higher than a results page, so quote it first (step above). It
takes a keywords array:
run {"endpointId": "job:google.keywords.volume", "input": {"keywords": ["best crm for startups"], "location_name": "United States"}, "idempotencyKey": "geo-crm-volume", "fallback": true}curl -s "https://api.looot.ai/v1/runs?wait=20" \
-H "Authorization: Bearer $LOOOT_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"endpointId": "job:google.keywords.volume",
"input": {"keywords": ["best crm for startups"], "location_name": "United States"},
"idempotencyKey": "geo-crm-volume",
"fallback": true
}'looot run job:google.keywords.volume \
--input '{"keywords": ["best crm for startups"], "location_name": "United States"}' \
--waitDomain strength
backlinks.domain.summary takes domain and gives back authority and backlink totals:
run {"endpointId": "job:backlinks.domain.summary", "input": {"domain": "example.com"}, "idempotencyKey": "geo-example-backlinks", "fallback": true}Read normalized.fields.backlinks, .referringDomains and .rank when normalized is present,
or result otherwise.
Report
Say where the domain sits in the organic results, whether each AI answer mentions or cites it and
what it says, the keyword’s search volume, and the domain’s backlink totals. Name the provider
behind each fact (servedProviderId) and the total spent (actualCost summed across runs).
What the answer looks like
| Field | What it is |
|---|---|
status |
completed, failed, queued, running |
outcome |
hit, weak, miss, error, rejected, skipped or pending |
servedProviderId |
the provider that answered |
actualCost |
what this run charged |
normalized.fields |
only on backlinks.domain.summary: backlinks, referringDomains, rank |
route.summary |
fallback runs only |
The organic, AI-answer and keyword-volume jobs have no normalized map yet: read result and
check the field names the provider used, or use inspect on the endpoint first to see its
outputSchema.
On a miss or error
- An AI answer job with one provider and no
fallback: a miss there is a plainoutcome: "miss", with nothing else to try. Retry later or note the gap in the report. no_supply_for_job: no endpoint currently does that job.capability_requestasks looot to add one.insufficient_balance: the run is blocked and not charged. Usetop_up, then retry with a newidempotencyKey.