LSD

LLM Scraper

Scrape what ChatGPT or Gemini answers for a keyword. A budget-friendly alternative to LLM Response that returns the answer text, the local businesses named in it, and the sources it cited.

When to use this

Like LLM Response but cheaper. It drives a real ChatGPT or Gemini session for a keyword and returns the answer, the businesses named in it and the sources behind it. Great for bulk monitoring at lower cost.

POST/v1/ai/scraper
Cost: 4 credits ($0.02)
Rate Limit: Varies by plan
Response: ~30-90 seconds

Parameters

ParameterTypeRequiredDescription
keywordstringYesKeyword to scrape results for
platformstringYes"chat_gpt" or "gemini"
locationstringNoLocation (e.g. "Austin, TX"). Gemini supports city-level; ChatGPT resolves to country. Default: United States
force_web_searchbooleanNoRequire the platform to search the web before answering. Accepted on chat_gpt only; gemini decides for itself and returns a 400 if you ask. Does not change the price. Use it when a prompt comes back as a clarifying question instead of an answer.
languagestringNoLanguage to ask in, as an ISO 639-1 code or name ("fr", "French"). Defaults to the language of the market you pass — a French location is asked in French. The scraper queries the model live and covers 43 languages, so it is not limited the way the AI mention endpoints are.
freshbooleanNoBypass the cached answer and run the request again. Always billed; the response reports cached: false. Use when sampling the same prompt to measure how the answer varies.

Example Request

curl -X POST https://api.localseodata.com/v1/ai/scraper \
  -H "Authorization: Bearer sk_live_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "keyword": "best plumber Austin",
    "platform": "gemini",
    "location": "Austin, Texas"
  }'

Example Response

JSON
{
  "status": "success",
  "credits_used": 4,
  "data": {
    "keyword": "best plumber Austin",
    "platform": "gemini",
    "model": "gemini-2.5-flash",
    "markdown": "Based on reviews, here are the best plumbers in Austin:\n\n1. **ABC Plumbing** - 4.9 stars...",
    "local_businesses": [
      {
        "rank": 1,
        "name": "ABC Plumbing",
        "category": "Plumber",
        "rating": 4.9,
        "reviews_count": 2100,
        "address": "1200 S Congress Ave, Austin, TX 78704",
        "phone": "+1 512-555-0142",
        "website": "https://abcplumbing.com",
        "domain": "abcplumbing.com"
      }
    ],
    "recommended_businesses": [
      {
        "shortlist_rank": 1,
        "listed": true,
        "name": "ABC Plumbing",
        "mention": "ABC Plumbing — 4.9 stars, 24/7 emergency callouts across South Austin.",
        "is_top_pick": false,
        "citation": { "url": "https://abcplumbing.com/", "domain": "abcplumbing.com" }
      }
    ],
    "reader_version": 5,
    "search_results": [],
    "sources": [
      { "title": "Yelp Austin Plumbers", "url": "https://yelp.com/...", "domain": "yelp.com", "snippet": "Top plumbers...", "position": 1 }
    ],
    "fan_out_queries": ["plumber austin reviews", "emergency plumber austin"],
    "brand_entities": [{ "title": "ABC Plumbing", "category": "local_business" }]
  }
}

Response Fields

FieldTypeDescription
keywordstringThe keyword that was searched
platformstringWhich platform was scraped
modelstringModel version used (e.g. gemini-2.5-flash)
markdownstringFull AI response in markdown format
local_businessesarrayBusinesses named in the answer ({rank, name, category, rating, reviews_count, address, phone, website, domain}). chat_gpt returns these on local questions; gemini has no equivalent block and returns an empty array. Field names match /v1/serp/local-pack, so code that parses the local pack works here unchanged.
recommended_businessesarrayThe shortlist the answer argues for, read out of its own prose, in the order it argued for them. A different ranking of different things from local_businesses — and on gemini, which emits no structured block, the only one there is. Each entry carries shortlist_rank (null when the answer named the business outside its list), listed, the answer's own mention, is_top_pick and the citation behind it.
reader_versionintegerWhich version of the prose reader produced recommended_businesses. The shortlist is our reading of the answer, not data the platform returned, so two stored responses read at different versions are not comparable
search_resultsarrayReturned as collected. We have not observed it populated on either platform, forced or unforced, so treat it as empty and read sources instead.
sourcesarraySources cited in the response ({title, url, domain, snippet, position}). position is the order they were cited, starting at 1, counted after duplicate pages are collapsed.
fan_out_queriesarrayRelated follow-up queries. Often empty — whether the platform returns any depends on the query.
brand_entitiesarrayBrands mentioned ({title, category}). Populated by chat_gpt on local queries; gemini has not returned any in our testing.

Notes

  • chat_gpt sometimes answers a local prompt with a clarifying question rather than an answer ("which Orange County do you mean?"), which reads as an empty result. Send force_web_search: true and it answers. In our testing two prompts that returned no answer unforced both returned full answers with sources when forced, at the same 4 credits. Worth knowing that a forced reading is slightly less like what a casual user triggers, so keep it consistent across runs you compare.
  • On a local question chat_gpt lists businesses inside its answer, and local_businesses returns them with rating, review count, address and phone — the same facts /v1/serp/local-pack gives, sourced from what the AI told the user rather than from the SERP. Pair it with force_web_search, which is what makes the block appear reliably on local prompts. Still 4 credits.
  • On gemini, local questions are often answered from Google Business Profiles rather than websites, and those citations come back with domain "maps.google.com" and the business name in title. The profile is identified by the cid parameter in the URL. Match on title or cid for those entries — matching on domain scores every one of them as a third-party source. In one 14-prompt local benchmark, 21 of 48 gemini scraper citations were profiles rather than websites.
  • local_businesses and recommended_businesses are two different rankings of different things and should not be merged. The first is the block of results the platform emitted; the second is the shortlist the answer argues for in its prose. A business the prose puts first can be absent from the block entirely, and on gemini the block is always empty.
  • recommended_businesses is read from the answer's prose by our own reader, not returned by the platform. reader_version stamps which version read it — compare two stored responses only when the versions match.
  • One call is a sample, not a fact: a model composes its answer per request, so ask twice ten minutes apart and the shortlist can differ. Use /v1/ai/sample when the client is asking how often they appear rather than whether they appeared once.
  • 4 credits vs 8 for LLM Response — use this for bulk keyword monitoring.
  • Supports ChatGPT and Gemini. Use /v1/ai/llm-response for Claude and Perplexity.
  • Gemini scraper supports city-level locations (e.g. 'Portland, OR'). ChatGPT scraper resolves all locations to country level. Use /v1/locations/search (free) to verify location formatting.
  • markdown gives the full response; search_results and sources show what websites the AI used.