Try it
Run a live Gemini rank check
One real call, no signup and no key. You get the cited sources and the raw JSON in one view.
Endpoints & Pricing
Gemini Citations, One Flat Rate
One call is one Gemini-labeled answer and the sources cited in it. The same rate bills whether an answer cites two sources or fifteen.
Single engine
- Up to 10 cited sources, 15 with
prompt_type=deep - Position, URL, domain, title and cited text per source
- Domain tracking with exact and subdomain matches
- The whole answer in
response_text
All four engines
- Gemini, ChatGPT, Claude and Perplexity in one call
- Half the price of four separate single-engine calls
- One blended visibility score across the four
- $10.00 an engine at Default, $0.50 an engine at Scale
A single deposit unlocks each discount — $100 for Growth, $500 for Scale — and the tier is permanent once earned. Nothing recurs, nothing expires, and every account starts with free API calls.
Quick Start
A Gemini Rank Check Without a Cloud Project
One API key in a header and three query parameters. There is no console to visit, no billing account to attach and no region to pick.
# The Gemini answer for a keyword, with every source it cited curl "https://apiserpent.com/api/ai/rank/gemini?q=best+email+marketing+platform" \ -H "X-API-Key: YOUR_API_KEY" # Track a domain: position, match type and the score come back filled in curl -G "https://apiserpent.com/api/ai/rank/gemini" \ --data-urlencode "q=best email marketing platform" \ -d "domain=mailchimp.com" -d "prompt_type=brand" \ -H "X-API-Key: YOUR_API_KEY"
# pip install requests import requests resp = requests.get( "https://apiserpent.com/api/ai/rank/gemini", params={"q": "best email marketing platform", "domain": "mailchimp.com"}, headers={"X-API-Key": "YOUR_API_KEY"}, timeout=60, ) gemini = resp.json()["results"]["gemini"] print(gemini["target_found"], gemini["target_position"]) for c in gemini["citations"]: print(c["position"], c["domain"], c["title"])
// Node 18+ — fetch is built in. Allow a generous timeout. const qs = new URLSearchParams({ q: 'best email marketing platform', domain: 'mailchimp.com' }); const res = await fetch('https://apiserpent.com/api/ai/rank/gemini?' + qs, { headers: { 'X-API-Key': process.env.SERPENT_KEY }, signal: AbortSignal.timeout(60000) }); const { results, aggregate } = await res.json(); console.log(results.gemini.target_position, aggregate.visibility_score); console.log(aggregate.all_domains_cited.join(', '));
{
"success": true,
"run_id": "2f9c7d13-58ab-4e60-9c0a-33b1de5f8102",
"keyword": "best email marketing platform",
"target_domain": "mailchimp.com",
"results": {
"gemini": {
"llm": "gemini",
"model": "gemini-3.1-pro",
"citations": [
{
"position": 1,
"url": "https://example.com/email-platforms-2026",
"title": "Email Marketing Platforms Compared, 2026",
"cited_text": "...list size is what actually drives the monthly bill [1]",
"url_normalized": "example.com/email-platforms-2026",
"domain": "example.com"
},
{
"position": 2,
"url": "https://mailchimp.com/pricing",
"title": "Mailchimp Pricing",
"cited_text": "...a free plan capped by contacts rather than by sends [2]",
"url_normalized": "mailchimp.com/pricing",
"domain": "mailchimp.com"
}
],
"target_found": true,
"target_position": 2,
"target_match_type": "exact",
"target_matched_domain": "mailchimp.com",
"total_citations": 8,
"response_text": "Most teams narrow this down by list size and automation needs...",
"error": null
}
},
"aggregate": {
"visibility_score": 21,
"found_in": ["gemini"],
"best_position": { "engine": "gemini", "position": 2 },
"all_domains_cited": ["example.com", "mailchimp.com"],
"total_latency_ms": 11960
},
"meta": { "elapsed": "11990ms", "timestamp": "2026-09-08T10:00:00.000Z" }
}
A score of 21 on a single-engine call is not a low score. visibility_score is weighted per engine and blended across the engines in the response, so a Gemini-only call tops out at 25. Chart target_position for one engine and call /api/ai/rank when you want the full 0–100 blend across all four.
Data Fields
Every Field a Gemini Call Returns
Named JSON fields you can index straight into. Every key is present on every response, so an answer that cited nothing still returns the same object.
Cited source fields
- citations[].position
- citations[].url
- citations[].title
- citations[].cited_text
- citations[].url_normalized
- citations[].domain
- total_citations
Domain tracking fields
- target_domain
- target_found
- target_position
- target_match_type
- target_matched_domain
- aggregate.found_in
- aggregate.best_position
Answer and run fields
- run_id
- keyword
- llm
- model
- response_text
- aggregate.visibility_score
- aggregate.all_domains_cited
- aggregate.total_latency_ms
- meta.elapsed
Request parameters
- q (the question, required)
- keyword (alias for q)
- domain (optional target)
- prompt_type=standard (default)
- prompt_type=deep (up to 15 citations)
- prompt_type=brand (comparison form)
- X-API-Key (request header)
Why Gemini citations
What Gemini citation data is, and why teams track it
Gemini answers appear inside the surface most brands already watch closely. A citation there is a placement you can count.
The official route costs more and asks for more
Google publishes 5,000 free requests a month on its own developer API, which is real and generous, and worth taking if it fits. Past that, its published rate is $14.00 per 1,000 requests plus token costs — dearer than every other rate in the comparison table below.
It also wants a Google Cloud project, a billing account and a service credential. This endpoint wants an API key in a header.
A citation is the placement
An answer names a few sources and the reader stops there. citations[] is ordered by first appearance, so position is a genuine ordering rather than an array index, and target_position is what moves when your content changes.
all_domains_cited gives you the whole field in the same call, so one request per keyword measures your competitors as well as yourself.
Priced per call, with no plan attached
Most of this market sells a monthly dashboard seat and puts API access behind the top plan. Athena publishes $295 a month, which is $81.94 per 1,000 responses; Profound’s lowest published credit rate is $44.33 per 1,000, on annual billing.
Here the unit is a call and the price is flat at any volume. Ten calls cost ten calls, and there is no plan to cancel afterwards.
The score has a per-engine ceiling
visibility_score is weighted by engine and blended across the engines present in the response, so a Gemini-only call tops out at 25 even when your domain is cited first. The cap is set by the blend, not by how well the page did.
Use target_position for a single-engine series, and /api/ai/rank when you want the full 0–100 number across all four engines at once.
Price comparison
What One Gemini Answer Costs, By Vendor
Each cell is that vendor’s lowest published rate, including the two that undercut our Growth tier, beside what reaching it costs.
| Provider | Cost per 1,000 | Unit | What the lowest rate requires | Free tier |
|---|---|---|---|---|
| Serpent (ours) | $1.00 | 1 call = 1 Gemini answer | One-time $500 deposit, permanent | Free to start |
| Oxylabs | $0.95 | Per result, 17 parsed fields | A custom quote. Its cheapest rate on a plan with a published price is $1.00 on $999 a month | 2,000 results |
| SearchApi.io | $1.00 | Per search | $5,000 a month | 100 requests |
| ScrapingBee | $1.12 | 15 credits per request | $599 a month | 1,000 credits |
| DataForSEO LLM Scraper | $1.20 | Per results page | $50 minimum deposit, and a queue of up to 45 minutes | None |
| cloro.dev | $1.22 | 4 credits per request | $5,000 a month | 500 credits a month |
| Bright Data | $1.30 | Per record | $499 a month | 5,000 records a month |
| Google (own API) | $14.00 plus tokens | Per request | A Google Cloud project and a billing account | 5,000 requests a month |
The Oxylabs, DataForSEO, ScrapingBee and SearchApi.io rows were re-read from those pages on 2026-09-10; the rest were read on 2026-09-08 and are unchanged. Oxylabs publishes a cheaper non-JavaScript band as well, but nowhere states whether it applies to the AI targets, so the rate quoted here is its lowest published JavaScript one. Its plan tiles rotate in a carousel, so a single page view shows only part of the ladder.
$1.00 per 1,000 on Scale is the lowest rate here that a one-time payment reaches. SearchApi.io matches it and needs $5,000 a month; Oxylabs goes lower, to $0.95, but only on a quote-only tier, and its cheapest rate on a plan with a published price is $1.00 on $999 a month. Every other rate under $2.00 here sits behind a recurring plan too, from $499 to $5,000 a month. Ours is unlocked by depositing $500 once, and that tier is never withdrawn.
We are not the cheapest at Default or Growth, and the alternatives that beat those two rates deserve naming. ScrapingBee reaches $1.12 on a $599 monthly plan. DataForSEO reaches $1.20 for a $50 minimum deposit, but that is a queue that can take up to 45 minutes rather than a call you wait on; their live rate is $4.00 per 1,000, twice our Growth rate.
Google’s own developer API is the honest outlier. Its 5,000 free requests a month are real, and if your volume fits inside them it is the cheapest option on this page. Past that it is $14.00 per 1,000 requests plus token costs, and it needs a Google Cloud project that none of the other rows here require.
Use cases
What Teams Run Gemini Rank Checks For
Four jobs this endpoint gets bought for, and the parameter or field each one leans on.
Tracking a Google-ecosystem surface
Teams that already report Google rankings usually want the Gemini column next to them, on the same keyword list and the same weekly cadence. One call per keyword, with your own domain, gives you target_found and target_position to sit beside the rank.
Keep prompt_type=standard across a series so the question stays the same from week to week.
Share of citations against rivals
all_domains_cited is the deduplicated domain list for the run, so a single call per keyword measures the whole field. Count appearances per competitor across a keyword set and you have a share number rather than an anecdote.
No domain is required. Leave it out and you still get every citation; only the target fields and the score stay empty.
Testing whether a page is quotable
cited_text carries the passage around each reference in the answer, so you can see which claim on a page got picked up rather than only that the page was named.
Rewrite, wait, re-run the same keyword, and compare the two citation lists. The evidence lives in your own storage, not in a vendor dashboard.
Buying questions and long-form audits
prompt_type=brand asks the comparison form of a query, so the answer names and ranks options instead of describing a category — the shape a buyer actually types.
prompt_type=deep raises the ceiling from 10 citations to 15 for topic audits, where the long tail of sources matters more than the top few.
# date, keyword, our position, how many sources the answer cited, and the # full domain list -- enough to rebuild share of citations later. DOMAIN="example.com" while IFS= read -r kw; do curl -s -G "https://apiserpent.com/api/ai/rank/gemini" \ --data-urlencode "q=$kw" \ -d "domain=$DOMAIN" \ -H "X-API-Key: $SERPENT_KEY" \ | jq -r --arg d "$(date -u +%F)" --arg k "$kw" \ '[$d, $k, (.results.gemini.target_position // 0), .results.gemini.total_citations, (.aggregate.all_domains_cited | join("|"))] | @csv' \ >> gemini-citations.csv done < keywords.txt
FAQ
Gemini Rank Tracking API Questions
position, url, domain, page title, a normalized URL for matching, and cited_text, which is the passage of the answer the reference sits in. Per response: total_citations, the answer in response_text, the public model label, and — only if you sent a domain — the target fields and a score.
model field with the public Gemini model label, currently gemini-3.1-pro. Store it with each result so that when the label changes, a shift in your chart has an explanation in your own data rather than looking like unexplained movement.
visibility_score blends the engines in the response and weights each one, so a Gemini-only call has a single contributor and cannot pass 25 — not even from first place. The ceiling belongs to the blend, not to your page. Chart target_position when you are watching one engine, and use /api/ai/rank when you want the whole 0 to 100 range.
prompt_type=deep. Both are ceilings rather than promises: narrow questions often produce fewer, and total_citations reports how many arrived. When nothing was cited, citations comes back as an empty array rather than a missing key, so your parser never has to branch.
target_match_type reads exact when the cited domain is the one you asked for, and subdomain when it is a host beneath it, with that host in target_matched_domain. The exact form is checked before the subdomain form, so your main domain takes precedence whenever both were cited.
GET /api/ai/rank answers for all four at once, nesting the same object under each engine name. Its rate is $40.00 per 1,000 on Default, $4.00 on Growth and $2.00 on Scale, so four engines cost half what four separate calls would, in a single wait. Narrow it with engines=gemini,chatgpt if you want two; the combined rate applies to any call that names more than one.
Start tracking Gemini citations
free API calls, no card, no subscription and no Cloud project. Gemini rank checks from $1.00 per 1,000 queries.
Try for Free
