Skip to main content
POST
Monitor ChatGPT Responses
Extract structured data from ChatGPT: shopping cards, brand entities, map entries, raw response data, and query fan-out.
Web search forced by defaultThis endpoint enables ChatGPT’s web search mode on every request, so responses include current information from the web with source citations. Set disableWebSearch: true to get the answer ChatGPT gives on its own instead.

Request parameters

Uses common parameters. All ChatGPT-specific include.* flags are listed in the auto-generated request schema below. legacy: true asks for ChatGPT’s legacy desktop interface instead of the default mobile-web one. It streams the answer as an event stream, so result.model, result.searchQueries, and result.mapSearchQueries come back populated. disableWebSearch: true stops cloro from forcing web search. ChatGPT then searches only when it decides to, which for most prompts means no search: expect result.sources, result.citationPills, and result.searchQueries to be empty, and the answer text to differ from the search-forced one. Use it to see what ChatGPT says without search, and the default to measure citations. The base cost is the same.
legacy is a temporary workaroundOpenAI decides which interface it serves and is rolling out mobile-web as the default, so legacy: true is a best-effort request that can stop working without notice. Keep your client handling both shapes: even with the flag set, treat result.model, result.searchQueries, and result.mapSearchQueries as possibly empty, and rawResponse as either the event-stream or the HTML-fragment shape.
Additional credit costEnabling any of include.rawResponse, include.searchQueries, include.ads, or include.shopping (or any combination) adds +2 credits to the base cost.

Response objects

Response schema

Includes common response fields plus:

Common questions

How does cloro retrieve ChatGPT responses?

cloro does not call the ChatGPT API. Each request runs through a real browser session against ChatGPT’s web interface, routed through a proxy in the country (and, where supported, state) you specify. The result.* fields are extracted from that page; the raw SSE events are available via include.rawResponse: true. See How does cloro retrieve data from AI providers? for the implications (model routing, auth walls, geo behavior).

Can I get the search queries that ChatGPT uses?

Yes. Set include.searchQueries: true to get the fan-out queries ChatGPT runs internally. The same flag also returns result.mapSearchQueries: the queries ChatGPT sends to the maps tool to build the map block, separate from the web-search fan-out in result.searchQueries.

Are query fan-outs available for all ChatGPT responses?

ChatGPT uses gpt-5-3 and gpt-5-3-mini that include fan-out queries; newer models may not include explicit fan-outs. ChatGPT automatically selects which model to use for each request, so we cannot control the presence of query fan-outs.

Are query fan-outs available for other providers?

For a complete comparison of query fan-out support across all providers, see the Providers & pricing guide.

Why is a fan-out query a single long string instead of separated keywords?

That is expected. ChatGPT’s search model decides the shape of each fan-out query, and often emits a single long natural-language query rather than a keyword list. Length and structure vary between runs, even for the same prompt, and cloro returns the queries exactly as ChatGPT generates them. This LinkedIn post by Stefan Landwehr documents the same behavior.

Why aren’t shopping cards appearing in my responses?

Shopping cards only appear when the prompt is related to products or shopping:
Even shopping queries don’t always return cards — it depends on what ChatGPT finds and how it formats the response.

Which providers support shopping cards?

For a complete comparison of shopping card support across all providers, see the Providers & pricing guide.

My non-English prompts are returning English fan-out queries. Is that expected?

Yes. ChatGPT may generate some or all of its internal search queries (result.searchQueries) in English regardless of prompt language — a roughly 50/50 English/local-language split has been observed. This is upstream behavior; cloro returns the queries as generated. For multilingual GEO monitoring, filter or group by query language.

Why are result.model, searchQueries, or mapSearchQueries sometimes empty?

OpenAI serves a share of logged-out ChatGPT traffic through a mobile-web response format that streams the answer as HTML fragments instead of the usual event stream. Those responses carry no stream metadata, so result.model, result.searchQueries, and result.mapSearchQueries come back empty and result.sources is shorter. The answer text / markdown and inline citationPills are unaffected. “Mobile-web” is OpenAI’s response format, not the requesting device. OpenAI decides the format per request, so identical requests can land in either — treat these fields as possibly empty. See the 21st July 2026 changelog entry for the full breakdown. legacy: true asks for the legacy desktop interface, which streams the event stream these fields are read from. It is best-effort and temporary — see Request parameters.

What’s the difference between shopping cards and inline products?

Shopping cards are grouped collections of products displayed together (like a carousel):
  • Contain multiple products
  • Include category tags
  • For browsing multiple options
Inline products are individual product references:
  • Single product per entry
  • Include pricing, offers, images, and ratings
  • Can be embedded inline in text, comparison tables, or featured displays
  • Have rendering hints (inline, hero, block)
Both are extracted only when include.shopping: true is set in the request.

Authorizations

Authorization
string
header
required

cloro API key as a bearer token. One key grants every endpoint in this spec; per-key scopes are not available, so a client cannot request a narrower permission. Keys are created, rotated, and revoked in the dashboard.

Body

application/json

Request parameters for monitoring ChatGPT responses

prompt
string
required

The prompt to send to ChatGPT

Required string length: 1 - 10000
Example:

"What do you know about Acme Corp?"

country
enum<string>
required

Country/region code for localized response, using ISO 3166-1 alpha-2 country codes.

Available options:
AD,
AE,
AF,
AG,
AI,
AL,
AM,
AO,
AQ,
AR,
AS,
AT,
AU,
AW,
AX,
AZ,
BA,
BB,
BD,
BE,
BF,
BG,
BH,
BI,
BJ,
BL,
BM,
BN,
BO,
BQ,
BR,
BS,
BT,
BV,
BW,
BY,
BZ,
CA,
CC,
CD,
CF,
CG,
CH,
CI,
CK,
CL,
CM,
CN,
CO,
CR,
CU,
CV,
CW,
CX,
CY,
CZ,
DE,
DJ,
DK,
DM,
DO,
DZ,
EC,
EE,
EG,
EH,
ER,
ES,
ET,
FI,
FJ,
FK,
FM,
FO,
FR,
GA,
GB,
GD,
GE,
GF,
GG,
GH,
GI,
GL,
GM,
GN,
GP,
GQ,
GR,
GS,
GT,
GU,
GW,
GY,
HK,
HM,
HN,
HR,
HT,
HU,
ID,
IE,
IL,
IM,
IN,
IO,
IQ,
IR,
IS,
IT,
JE,
JM,
JO,
JP,
KE,
KG,
KH,
KI,
KM,
KN,
KP,
KR,
KW,
KY,
KZ,
LA,
LB,
LC,
LI,
LK,
LR,
LS,
LT,
LU,
LV,
LY,
MA,
MC,
MD,
ME,
MF,
MG,
MH,
MK,
ML,
MM,
MN,
MO,
MP,
MQ,
MR,
MS,
MT,
MU,
MV,
MW,
MX,
MY,
MZ,
NA,
NC,
NE,
NF,
NG,
NI,
NL,
NO,
NP,
NR,
NU,
NZ,
OM,
PA,
PE,
PF,
PG,
PH,
PK,
PL,
PM,
PN,
PR,
PS,
PT,
PW,
PY,
QA,
RE,
RO,
RS,
RU,
RW,
SA,
SB,
SC,
SD,
SE,
SG,
SH,
SI,
SJ,
SK,
SL,
SM,
SN,
SO,
SR,
SS,
ST,
SV,
SX,
SY,
SZ,
TC,
TD,
TF,
TG,
TH,
TJ,
TK,
TL,
TM,
TN,
TO,
TR,
TT,
TV,
TW,
TZ,
UA,
UG,
UM,
US,
UY,
UZ,
VA,
VC,
VE,
VG,
VI,
VN,
VU,
WF,
WS,
XK,
YE,
YT,
ZA,
ZM,
ZW
Example:

"US"

include
object

Optional flags for including additional response formats

Example:
legacy
boolean
default:false

Serve ChatGPT's legacy desktop interface instead of the default mobile-web one. The legacy interface streams the answer as an event stream, so result.model, result.searchQueries and result.mapSearchQueries are populated. Best-effort and temporary: OpenAI controls which interface it serves and can retire the legacy one at any time, so a request can still come back in the mobile-web shape. Handle both. Defaults to false.

Example:

true

Do not force ChatGPT's web search. cloro returns the answer ChatGPT gives on its own, which uses web search only when ChatGPT decides to, so result.sources, result.citationPills and result.searchQueries are often empty. Defaults to false: web search is forced on every request.

Example:

true

state
enum<string>

State code for sub-country geo-targeting (e.g., "CA"). Only valid with country "US".

Available options:
AL,
AK,
AZ,
AR,
CA,
CO,
CT,
DE,
DC,
FL,
GA,
HI,
ID,
IL,
IN,
IA,
KS,
KY,
LA,
ME,
MD,
MA,
MI,
MN,
MS,
MO,
MT,
NE,
NV,
NH,
NJ,
NM,
NY,
NC,
ND,
OH,
OK,
OR,
PA,
RI,
SC,
SD,
TN,
TX,
UT,
VT,
VA,
WA,
WV,
WI,
WY
Required string length: 2
Pattern: ^[A-Z]{2}$
Example:

"CA"

Response

successful ChatGPT monitoring response

success
boolean
required
Example:

true

result
object
required

ChatGPT's response data