Try it
Run a live ChatGPT rank check
One real call, no signup and no key. You get the citation list and the raw JSON beside it.
Endpoints & Pricing
ChatGPT Citations, Priced Per Call
One call is one ChatGPT-labeled answer and every source cited in it. The rate is flat: prompt style and citation count never change it.
Single engine
- Up to 10 citations, 15 with
prompt_type=deep - Position, URL, domain, title and cited text per source
- Pass
domainfor match type, position and score - Full answer text in
response_text
All four engines
- ChatGPT, Claude, Gemini 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
Growth unlocks at a one-time $100 deposit and Scale at a one-time $500 deposit. Both are permanent, neither is a monthly plan, and a tier once earned never downgrades. Every account starts with free API calls.
Quick Start
Your First ChatGPT Rank Check
Three parameters, one endpoint. Add domain and the response fills in your position and score; leave it out and the citation list comes back on its own.
# One ChatGPT rank check: the answer, and every source cited in it curl "https://apiserpent.com/api/ai/rank/chatgpt?q=best+crm+software+for+startups" \ -H "X-API-Key: YOUR_API_KEY" # With a target domain: target_found, target_position and the score fill in curl -G "https://apiserpent.com/api/ai/rank/chatgpt" \ --data-urlencode "q=best crm software for startups" \ -d "domain=hubspot.com" -d "prompt_type=brand" \ -H "X-API-Key: YOUR_API_KEY"
# pip install requests import requests r = requests.get( "https://apiserpent.com/api/ai/rank/chatgpt", params={"q": "best crm software for startups", "domain": "hubspot.com"}, headers={"X-API-Key": "YOUR_API_KEY"}, timeout=60, ) row = r.json()["results"]["chatgpt"] print(row["target_found"], row["target_position"], row["total_citations"]) for c in row["citations"]: print(c["position"], c["domain"], c["title"])
// Node 18+ — fetch is built in. Allow a generous timeout. const qs = new URLSearchParams({ q: 'best crm software for startups', domain: 'hubspot.com', prompt_type: 'deep' }); const res = await fetch('https://apiserpent.com/api/ai/rank/chatgpt?' + qs, { headers: { 'X-API-Key': process.env.SERPENT_KEY }, signal: AbortSignal.timeout(60000) }); const { results, aggregate } = await res.json(); console.log(aggregate.visibility_score, results.chatgpt.target_position); for (const c of results.chatgpt.citations) console.log(c.position, c.domain, c.title);
{
"success": true,
"run_id": "550e8400-e29b-41d4-a716-446655440000",
"keyword": "best crm software for startups",
"target_domain": "hubspot.com",
"results": {
"chatgpt": {
"llm": "chatgpt",
"model": "gpt-5.5",
"citations": [
{
"position": 1,
"url": "https://example.com/best-crm-software",
"title": "The 12 Best CRM Platforms for Startups in 2026",
"cited_text": "...teams under 20 seats usually land on a per-seat plan [1]",
"url_normalized": "example.com/best-crm-software",
"domain": "example.com"
},
{
"position": 3,
"url": "https://hubspot.com/products/crm",
"title": "HubSpot CRM",
"cited_text": "...a free tier that covers contact management [3]",
"url_normalized": "hubspot.com/products/crm",
"domain": "hubspot.com"
}
],
"target_found": true,
"target_position": 3,
"target_match_type": "exact",
"target_matched_domain": "hubspot.com",
"total_citations": 9,
"response_text": "For a startup sales team the shortlist is usually...",
"error": null
}
},
"aggregate": {
"visibility_score": 25,
"found_in": ["chatgpt"],
"best_position": { "engine": "chatgpt", "position": 3 },
"all_domains_cited": ["example.com", "hubspot.com"],
"total_latency_ms": 12480
},
"meta": { "elapsed": "12510ms", "timestamp": "2026-09-08T10:00:00.000Z" }
}
Every key above is present on every response. A run that cited nothing returns citations as an empty array rather than dropping the key, and visibility_score is null whenever no domain was passed — so a parser written once never has to branch. position is the order of first appearance in the answer, not a list index.
Data Fields
Every Field a ChatGPT Call Returns
Named JSON fields, not prose you have to parse. Nothing here needs a parser of your own, and nothing changes shape between calls.
Citation fields
- citations[].position
- citations[].url
- citations[].title
- citations[].cited_text
- citations[].url_normalized
- citations[].domain
- total_citations
Target match 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 ChatGPT citations
What ChatGPT citation data is, and why teams buy it
An answer names a handful of sources. Being one of them is the visibility a blue-link ranking no longer guarantees.
A citation is the whole click
A results page shows ten links and the reader chooses. An answer shows a paragraph and names a few sources inside it. If your domain is not one of them, that query produced nothing for you — whatever your rank on the same keyword.
citations[] is ordered by first appearance in the answer, so position is a real ordering rather than an array index, and target_position is the number worth charting week over week.
Priced per call, not per seat
Most tools in this market sell a monthly dashboard seat and put API access behind their top plan. Athena publishes $295 a month, which works out at $81.94 per 1,000 responses. Profound’s lowest published credit rate is $44.33 per 1,000 responses, on annual billing, with its API on the Enterprise plan only.
This endpoint bills a flat rate per call at every volume. There is no plan to sign and nothing to cancel: ten calls cost ten calls.
The score has a per-engine ceiling
visibility_score is weighted by engine and blended across the engines present in the response. On a single-engine call only that engine contributes, so a ChatGPT check tops out at 35 even when your domain is cited first.
That is a property of the blend, not of your visibility. Chart target_position for one engine, and call /api/ai/rank when you want the full 0–100 figure across all four.
One response shape, four engines
Swap chatgpt for claude, gemini or perplexity in the path and every key stays where it was. The combined endpoint nests the same object under each engine name, so a parser written once reads every one of them.
Subdomain matching is handled for you: ask for example.com, get a citation of docs.example.com, and target_match_type comes back as subdomain with the matched host beside it.
Price comparison
What One ChatGPT Answer Costs, By Vendor
Every cell is that vendor’s lowest published rate, including the ones that beat us, next to what reaching it costs.
| Provider | Cost per 1,000 | Unit | What the lowest rate requires | Free tier |
|---|---|---|---|---|
| Serpent (ours) | $1.00 | 1 call = 1 ChatGPT answer | One-time $500 deposit, permanent | Free to start |
| Oxylabs | $0.95 | Per result | 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 |
| Bright Data | $1.30 | Per record | $499 a month | 5,000 records a month |
| cloro.dev | $2.14 | 7 credits per request | $5,000 a month | 500 credits a month |
| OpenAI (own API) | $10.00 plus tokens | Per search call | No flat all-in rate is published | None |
| Profound | $44.33 | 1 credit = 1 response | Annual billing; API on Enterprise only | None |
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 also advertises a cheaper non-JavaScript band, but does not state whether it covers the AI targets, so its lowest published JavaScript rate is the one used here. Its plan tiles rotate in a carousel, so a single page view shows only part of the ladder.
At Scale, $1.00 per 1,000 is the lowest rate on this table 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. Ours needs a one-time $500 deposit that never expires and never downgrades.
At Default and Growth we are not the cheapest, and it is worth naming who is. DataForSEO’s Standard tier is $1.20 per 1,000 for a $50 minimum deposit — but that is a queue that can take up to 45 minutes rather than a call you wait on, and their live rate is $4.00 per 1,000, twice our Growth rate. ScrapingBee reaches $1.12 on a $599 monthly plan, and Oxylabs $1.00 on a $999 one or $0.95 on a custom quote.
OpenAI’s own API charges $10.00 per 1,000 search calls plus token costs, so the all-in figure moves with answer length and is not knowable before the call. What comes back is an answer, not a citation table with positions, a domain match and a score.
Use cases
What Teams Run ChatGPT Rank Checks For
Four jobs that account for most traffic on this endpoint, and the field or parameter each one turns on.
Weekly brand visibility log
Run your money keywords once a week with your own domain and store target_found, target_position and total_citations. Three columns and a date is a trend line; nothing else is needed to see movement.
Keep prompt_type=standard for a series. Changing the prompt style mid-run changes the question being asked, and the numbers stop comparing like with like.
Competitor share of citations
all_domains_cited is the deduplicated domain list for the whole run, so one call per keyword gives you the full field rather than only your own placement. Count how often each rival appears across a keyword set and you have share of citations on this engine.
No domain is needed for this. Leave it out and the citation list still arrives in full; only the target fields and the score stay empty.
Buying-question audits
prompt_type=brand asks the comparison form of a query, so the answer names and ranks options instead of explaining a category. It is the shape a buyer actually types, and it is where a missing citation costs revenue rather than traffic.
Pair it with prompt_type=deep, which raises the ceiling from 10 citations to 15, when you want the long tail of sources rather than the top few.
Content briefs from cited pages
Each citation carries the page title and cited_text — the passage around the reference in the answer. That shows which claim on a page was picked up, not merely that the page was named.
Diff the cited domains for a keyword month over month and you catch a competitor page displacing yours before the traffic moves.
# One line per keyword: date, keyword, our citation position (0 when not cited). DOMAIN="example.com" while IFS= read -r kw; do pos=$(curl -s -G "https://apiserpent.com/api/ai/rank/chatgpt" \ --data-urlencode "q=$kw" \ -d "domain=$DOMAIN" \ -H "X-API-Key: $SERPENT_KEY" \ | jq -r '.results.chatgpt.target_position // 0') echo "$(date -u +%F),$kw,$pos" >> chatgpt-citations.csv done < keywords.txt
FAQ
ChatGPT Rank Tracking API Questions
position, url, domain, page title, the passage around the reference in cited_text, and a normalized URL for matching. Alongside them you get total_citations, the whole answer in response_text, the public model label and, when you pass a domain, target_found, target_position, target_match_type and a visibility score.
prompt_type=deep. Those are ceilings rather than promises: a narrow question often produces fewer, and total_citations tells you how many arrived. A run that cited nothing returns citations as an empty array rather than dropping the key, so your parser never has to branch on a missing field.
model field with the public ChatGPT model label, currently gpt-5.5. Store it beside each result. When the label changes, a shift in your chart has an explanation in your own data instead of looking like unexplained movement.
visibility_score is weighted per engine and blended across the engines present in the response. A single-engine ChatGPT call therefore tops out at 35, even when your domain is cited first. For the full 0 to 100 blend, call /api/ai/rank, which runs all four engines. For one engine, chart target_position instead: it is the number that actually moves.
standard asks the query directly and is the right default for a repeatable series. deep asks for a fuller treatment and raises the citation ceiling from 10 to 15. brand asks the comparison form of the query, so the answer names and ranks options rather than explaining the category. Keep one style per series, because changing it changes the question being asked.
target_match_type to exact. A citation of one of its subdomains sets it to subdomain and puts the matched host in target_matched_domain. Exact is tried first, so a page on your main domain always wins over a subdomain when both are cited.
GET /api/ai/rank runs all four and nests the same object under each engine name. It costs $40.00 per 1,000 on Default, $4.00 on Growth and $2.00 on Scale, which is half the price of running four single-engine calls. Add engines=chatgpt,gemini to run a subset; any call naming more than one engine bills at that combined rate.
Start tracking ChatGPT citations
free API calls, no card and no subscription. ChatGPT rank checks from $1.00 per 1,000 queries.
Try for Free

