Tools Reference

ai_visibility_compare

Compare how several domains or keywords are mentioned in one AI assistant's answers, side by side, from DataForSEO's LLM Mentions data. Pass 2-10 targets…

Cost: 90 credits per compared target — 2 to 10 compared targets per call, so 180 to 900 credits.

ai_visibility_compare asks the same question as ai_visibility about several targets side by side — your site and its rivals, or a set of keywords — in a single DataForSEO request. It is synchronous — everything comes back immediately, with no background job to poll.

What it does

Pass 2 to 10 targets (DataForSEO's own bound for this endpoint) and a platform. Each target is one of three things, and exactly one:

FieldWhat it compares
domainAny public domain, including a competitor's
keywordA search phrase rather than a site
project_idOne of your own projects — its domain is used

An optional label names the target in the answer; it defaults to the domain or keyword itself. Two targets may not share a label — DataForSEO echoes the label back and it is what rows are matched on, so a collision is refused rather than guessed at.

All the targets are bought in one DataForSEO request, not one request per target.

It ranks nothing

A side-by-side view is read top-down as a leaderboard unless it says otherwise, so this one says otherwise. The targets appear in the order you listed them. DataForSEO publishes no ordering field for this endpoint, so there is nothing to sort by and SeoGrep sorts nothing: position in the answer means only what you typed.

There is no visibility score, no share of voice and no winner. Every figure is a DataForSEO field under DataForSEO's own name.

"No row" is not "zero"

A compared target DataForSEO returned no row for is named as unanswered, and the answer says plainly that this is not a zero. The two are different facts — the vendor did not report on that target at all — and only one of them is about the target.

The same rule runs inside a row: a field the vendor did not report prints as unreported, while a genuine zero the vendor did send prints as 0.

What this answer is scoped to

The same four limits ai_visibility states, and for the same reason: one assistant, one locale, one moment (DataForSEO's own timestamp, under the vendor key it came from), and no date range at all — this endpoint takes none, so there is no period to ask for.

Example

Ask your MCP client in plain language:

Compare how example.com, rival-one.com and rival-two.com are mentioned in ChatGPT answers.

The client will ask you to confirm before a wide comparison runs — see Billing.

Input

FieldTypeRequiredDescription
targetsobject[]YesThe targets to compare — 2 to 10, which is DataForSEO's own bound for this endpoint. Each one is a domain, a keyword or one of your project ids. THE PRICE IS PER COMPARED TARGET (90 credits each), so this list is what the call costs: comparing ten targets costs ten targets' worth of credits, and a comparison above the safety threshold asks you to confirm before it runs.
platformstringYesWHICH assistant DataForSEO is asked about — required, with no default, because a measurement of one says nothing about the other. "chat_gpt": mentions observed in ChatGPT answers. "google": mentions observed in Google's AI answers. There is no "all assistants" option here, and no answer covers an assistant the vendor did not query.
internal_list_limitintegerNoHow many entries DataForSEO may put inside its internal sources_domain and search_results_domain arrays (1-10, default 10) — the vendor's own internal_list_limit, whose published ceiling is 10 on this endpoint. It controls how much supporting detail comes back, NOT what the lookup costs you. Asking for fewer rows costs the same; asking for more is refused.
location_namestringNoOPTIONAL DataForSEO location_name — a NAME, e.g. "United States", not the numeric location_code the other SeoGrep tools take (DataForSEO publishes a location_code for this endpoint too, defaulting to 2840; SeoGrep sends the name). Omitted by default, in which case the lookup runs in DataForSEO's own published default — the United States — and the answer says so rather than leaving you to guess. Spell it as DataForSEO names it (e.g. "Turkiye", not "Turkey"): the vendor matches this name exactly and rejects an unknown one AFTER the paid request has gone out, so on platform "google" a spelling SeoGrep has measured to be wrong is refused before anything is charged, naming the vendor's own. On platform "chat_gpt" the default above is the ONLY location the vendor has data for, and any other value is refused before anything is charged.
language_codestringNoOPTIONAL DataForSEO language_code, e.g. "en". Omitted by default, in which case the lookup runs in DataForSEO's own published default — "en", English — and the answer says so rather than leaving you to guess. On platform "chat_gpt" that default is the ONLY language the vendor has data for, and any other value is refused before anything is charged.
confirmbooleanNoSet to true to re-run a call this tool answered with a confirmation prompt — an estimated cost above the confirmation threshold, or a scope the tool asks you to confirm. Optional, and only meaningful after such a prompt: nothing is charged until the call is re-run with it.

Returns

A heading naming how many targets were compared and the DataForSEO function behind them, then the scope paragraph, then the note that the order is yours.

Then one block per target, in your order, each naming what its label stands for — your project, a domain or a keyword — followed by that target's rows under DataForSEO's own field names, or the sentence that says the vendor returned no row for it. Targets the vendor did not answer are also listed together at the end, so a long comparison does not hide them.

A comparison set outside 2-10, a target naming none (or several) of domain / keyword / project_id, two targets sharing a label, and a project_id that is not yours are all rejected before anything is charged; while live data is off you get a "not yet enabled" message instead — also free.

Billing

The price is per compared target, not per call — this is the one tool in SeoGrep priced that way. Comparing ten targets costs ten targets' worth of credits and comparing two costs two, and the cost line above states both ends of that range. The reservation is opened before the DataForSEO request and is sized from the targets you actually passed; if the request fails, the whole reservation is released and you are not charged.

A comparison above SeoGrep's safety threshold asks you first: the call returns an estimate and charges nothing until you run it again with "confirm": true. This is not a rare corner — it is the usual case. At the price above, only the two-target minimum runs straight through; three targets and up cross the threshold and prompt. Plan for the prompt rather than being surprised by it.

A failed lookup is not a lookup that found nothing. The refusal quotes DataForSEO's own status code and message, and says the half that "you were not charged" leaves out: the attempt did go out to DataForSEO and used part of SeoGrep's own daily third-party data allowance. That is our cost, not yours.

ai_visibility_compare needs a paid credit balance. It reads live data from a paid third-party provider, so it is not available on trial credits; the refusal arrives before anything is reserved and says outright that you were not charged. Buy any credit pack and it unlocks straight away; your existing credits are untouched and keep working for crawls, audits, reports and Search Console tools.

internal_list_limit is not a price control here either. The vendor's own words for it are "maximum number of elements within internal arrays": it caps two nested arrays inside each aggregate, not the rows returned and not the rows billed. An earlier version of this page called it part of the price; that claim is withdrawn. Asking for fewer entries costs the same, and asking for more than the vendor's published ceiling is refused before anything is charged.

Limitations

Every delivered lookup is recorded: SeoGrep keeps a row saying what was looked up, when, under which settings, and a capped summary of what came back. The Lookups page of your dashboard lists them, so a lookup you paid for an hour ago is still something you can point at.

That record is history, not a live surface. No call here reads a previous run, nothing is refreshed for you, and there is no "changed since last time" — so to see the current picture, run it again.

This is a measurement, not a prediction and not a verdict: it does not say which target is doing better, why an assistant mentioned one and not another, or what to change. A measurement on one platform does not carry over to another.

The location is a name (location_name), not the numeric location code the other SeoGrep tools take. DataForSEO does publish a numeric location_code for this endpoint as well — its default is 2840, the United States — but this tool sends the name.

chat_gpt is measured in one locale only. DataForSEO publishes ChatGPT mention data for the United States, in English, and for nothing else. A chat_gpt lookup naming any other location_name or language_code is refused before any credits are reserved and before anything goes out to the vendor — the vendor rejects it anyway, and without this check that rejection costs a paid attempt to discover. google is not restricted to one locale — DataForSEO publishes many locations for it — but the vendor matches a location NAME exactly, and rejects an unknown spelling only after the paid request has gone out. So spell it as DataForSEO does (Turkiye, not Turkey): a spelling SeoGrep has measured the vendor rejecting is refused before anything is charged, and the refusal names the vendor's own. That is a spelling check against SeoGrep's short table of measured names, not a check against this family's own list of supported locations — SeoGrep does not hold that list, and every answer says so.