The ChatGPT scraper by cloro gets ChatGPT responses programmatically, without the OpenAI API. It returns what ChatGPT's web interface shows a logged-out visitor, as structured JSON: answer text, cited sources and citation pills. Optional extras are Markdown, shopping cards, inline products, ads and the query fan-out terms behind the answer.
- Get an API key at cloro.dev.
- POST a prompt to
https://api.cloro.dev/v1/monitor/chatgpt. - Read the parsed fields from the JSON response.
The official OpenAI API is the wrong surface for brand monitoring, because the pages it cites differ from the ones ChatGPT's web UI shows its users. Reading that UI means getting past Cloudflare JA4 TLS fingerprinting and Turnstile, assembling a Server-Sent Events stream, and tracking CSS class names that change between deploys. cloro handles all of it server-side.
import requests
payload = {
'prompt': 'best project management software for remote teams',
'country': 'US',
'include': {'markdown': True, 'searchQueries': True},
}
response = requests.post(
'https://api.cloro.dev/v1/monitor/chatgpt',
headers={'Authorization': 'Bearer YOUR_API_KEY'},
json=payload,
)
print(response.json())curl -X POST https://api.cloro.dev/v1/monitor/chatgpt \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"prompt": "best running shoes for flat feet", "country": "US", "include": {"shopping": true}}'Node.js and async/webhook examples are in the endpoint documentation.
| Parameter | Description | Default |
|---|---|---|
prompt* |
The query or question (1-10,000 characters), or an array of up to 5 for a multi-turn conversation (result is then an array) |
– |
country* |
Country code for localized results (US, GB, DE) |
– |
state |
US state code for finer localization | – |
include.markdown |
Return the answer as Markdown | false |
include.html |
Return a URL to the full HTML (expires after 24h) | false |
include.rawResponse |
Return the unparsed upstream payload | false |
include.searchQueries |
Return the query fan-out terms ChatGPT searched | false |
include.shopping |
Return shopping cards and inline products | false |
include.ads |
Return sponsored blocks | false |
disableWebSearch |
Return the answer ChatGPT gives on its own instead of forcing a web search | false |
* Required
{
"success": true,
"result": {
"text": "For remote teams, the strongest options are...",
"citationPills": [{ "citationPillId": 0, "label": "Asana", "url": "https://asana.com", "domain": "asana.com" }],
"searchQueries": ["best project management software 2026", "asana vs monday remote teams"],
"markdown": "For remote teams, the strongest options are **Asana**..."
}
}Alongside text and markdown:
sources: every cited URL with position, label and description.citationPills: the inline citation chips, one entry per cited source, sharing acitationPillIdwhen a pill cites several.entities: the products, brands and concepts the answer names, each with a type.searchQueries: the query fan-out. ChatGPT decomposes one prompt into several searches, and these are the terms it actually ran, which is the clearest signal of how it read the question. It comes back empty on ChatGPT's default mobile-web interface;legacy: trueasks for the legacy interface that returns it, on a best-effort basis (why).shoppingCards: product carousels, each groupingproducts[]with their price and merchant offers (schema).inlineProducts: products embedded in the answer text, separate from the carousels.ads: sponsored blocks, parsed. ChatGPT currently shows them only in answers to a follow-up prompt, and far more often on the legacy interface: sendpromptas an array withlegacy: true(details).map: business and location entries with rating, reviews and address.rawResponse: the unparsed upstream payload, when you want to parse it yourself.followUpForm: the form ChatGPT shows to refine the prompt: its questions, their options and the follow-up prompt it would send (schema).nullwhen the answer has no form.
Full field-level schemas are in the endpoint reference.
- Brand monitoring: whether ChatGPT names you, and which sources it cites when it does.
- Competitive intelligence: who else is named on the prompts your buyers ask.
- Shopping and commerce: track how products surface in ChatGPT's shopping cards.
- Query fan-out research: see the sub-queries behind an answer, which is what you can actually optimize for.
With its web search tool it searches and cites sources, but it cites a different set of pages than ChatGPT shows its users. cloro reads ChatGPT's web interface in a real browser session, the surface users see.
With Playwright you run the browser sessions, proxies, retries and parsing yourself. cloro runs them behind one API call: a real browser session on ChatGPT's web interface through a proxy in the country you set, up to 5 attempts, and JSON back. You pay only for results. It also returns Perplexity, Gemini, Copilot, Google AI Mode and AI Overview answers.
cloro reads publicly visible responses from its own sessions. Do not use it to access other users' conversations or private data, and check your own jurisdiction and terms.
Yes. Set include.shopping: true. ChatGPT's current model shows products as cards in the answer, and they come back in inlineProducts with title, price, description, images, offers and the citations behind each product. Add include.productDetails: true for the rationale and reviews. Shopping is a +2 credit add-on; product details add +2 more. Older models also fill shoppingCards.
OpenAI ships UI changes roughly weekly, and dynamic CSS class names change between deploys. That maintenance is the point of a managed endpoint; a DIY scraper returns empty results rather than errors when it breaks, so alert on success rate rather than exceptions.
At least 5 minutes (300 seconds), because cloro retries failed attempts server-side before it answers (retries and cancellation). Use the async endpoint for batches.
- Endpoint reference: cloro.dev/docs
- Product page: cloro.dev/chatgpt
AI Mode · AI Overview · Copilot · Gemini · Google Search · Google News · Perplexity
Questions or support: ask the docs AI assistant.
