Model or dataset
ScrapingBee/chatgpt-scraper-api avatar
ScrapingBee/chatgpt-scraper-api

ScrapingBee chatgpt-scraper-api: a prompt-driven wrapper over a hosted ChatGPT endpoint

Collect structured responses from a ChatGPT scraper by sending a prompt with valid ChatGPT scraping API credentials. Enable live search, inject HTML context, and automate intelligent scraper ChatGPT workflows in just a few parameters.

1,023 stars1 forksUnknownLicense varies

At a glance

What is it?
This repository is a thin client and usage guide for ScrapingBee's hosted ChatGPT scraping endpoint, not a self-contained scraper. It is useful if you already pay for ScrapingBee and want structured extraction without selector maintenance; it is the wrong tool if you need to run the model yourself or control the retrieval pipeline.
Who is it for?
Adopt this if you already hold ScrapingBee credentials, your extraction targets change layout often, and you are willing to pay per call for a model to do the parsing. Do not adopt it if you need on-premise inference, deterministic output schemas, or a per-field audit trail, because the repository exposes no model choice, no temperature or seed control, and no schema enforcement beyond what you write in the prompt.
Can I use it commercially?
Not without permission. GitHub finds no licence file in the repository, and without a licence all rights are reserved by default: you may read the code but not reuse it. Check the README, or ask the authors, before using it.
Is it still maintained?
Yes. The repository last received commits 63 days ago.
What is it written in?
GitHub does not report a main language for this repository.

Answers come from the project's GitHub data, last synced on September 15, 2026, and from our analysis. They are not legal advice.

DEEP OPEN-SOURCE ANALYSIS

What problem the repository actually addresses

The README frames the problem as selector maintenance. Traditional scraping, it argues, requires CSS selector upkeep, proxy rotation, JavaScript rendering and continuous parsing updates, and layouts change often enough that scripts break. The proposed shift is to stop describing how to extract and instead describe what you want extracted, letting a model read the page and return fields. The intended audience is explicit in the text: people building a chatgpt scraper, integrating scraper chatgpt workflows, or doing automated research and data extraction. The stated sweet spot is pages whose layout varies or changes frequently, and the listed use cases are competitive research, product data extraction, lead harvesting, news monitoring, SEO analysis, content summarization and structured data normalization. One thing worth being clear about before anything else: this repository is not the scraper. It is a demonstration of how to call a hosted endpoint operated by ScrapingBee, documented with an npm SDK example and a raw HTTP example. The extraction logic, the browser fleet, the model and the search index all live behind app.scrapingbee.com. What you get here is the calling convention.

The request pipeline and the four parameters that control it

The README gives the flow as a single line: client, then ChatGPT Scraper API, then optional web search, then HTML retrieval, then AI processing, then a structured JSON response. Behaviour is steered by four parameters. prompt carries the instruction, and the README's own example uses a field list plus the phrase Return JSON. search is a boolean; when true the API performs a live web search before generating a response, and when false the model answers from existing knowledge and whatever context was supplied. country_code geolocates search results, with us as the documented example, aimed at region-specific pricing, local SEO analysis and country-based competitor monitoring. add_html injects raw HTML from the target page into the model's context, which the README says improves extraction accuracy because the model can see the page content directly. That last parameter is the one that makes this more than a chat wrapper. Without it you are asking a model a question. With it you are handing the model a document and asking it to read fields out of that document. The README does not specify how the target URL is conveyed when add_html is true, and the JavaScript example in the repository passes only prompt and params, so that detail is not resolvable from the supplied material.

Getting a call running: the SDK path and the raw HTTP path

Two integration routes are documented. The Node route starts with npm install scrapingbee, then constructs a client with new ScrapingBeeClient('YOUR_API_KEY'), and calls client.chatGPT() with an object containing prompt and a params object holding search, country_code and add_html. The README's first example asks for the latest web scraping trends with search true, country_code us and add_html false, then logs response.data. The second example switches to extraction: a prompt listing product_name, price and availability with Return JSON format, search false and add_html true, again logging response.data. The Python route skips the SDK entirely and posts JSON to https://app.scrapingbee.com/api/v1/chatgpt with an Authorization: Bearer YOUR_API_KEY header and a Content-Type: application/json header, sending prompt, search, country_code and add_html as top-level keys. Note the asymmetry, because it matters if you are porting between the two: in the JavaScript SDK the three behavioural flags sit nested under params, while in the raw HTTP payload they are siblings of prompt. The README shows a sample response of product_name Wireless Headphones, price 129.99 and availability In Stock, but it does not show the envelope around it. The SDK example reads response.data, which implies the SDK unwraps something, while the Python example prints response.json() directly. Treat the exact top-level shape as something to confirm on your first call rather than assume.

Where this approach breaks down

The README lists error codes 401 for an invalid API key, 403 for forbidden, 429 for rate limit exceeded and 500 for server error, and advises retry logic and usage monitoring in production. That is the honest part. The less obvious limitations follow from the design. Output is not schema-enforced. You ask for JSON in the prompt and you get something back, but nothing in the documentation describes a schema parameter, a validation layer or a guarantee that price arrives as a number rather than the string 129.99 USD. Any downstream consumer needs its own validation. Cost and latency scale with tokens, not with pages, so a long product page with add_html true is not priced like a small one, and the README gives no token accounting, no per-call pricing and no timeout guidance. There is no model selection, no temperature, no seed and no determinism control exposed, which means the same prompt against the same page can return different field formatting between runs. Debugging is a black box: when an extraction is wrong you cannot inspect the retrieval step, the injected HTML or the model's reasoning, only the final JSON. And the repository itself is a guide, not a library. There are no tests, no CI config and no pinned dependency version in the material provided, so there is nothing here to run in your own environment and nothing to regression-test against.

How it differs from selector-based extraction and from self-hosted LLM pipelines

The comparison the README draws is against traditional scraping with maintained CSS selectors. The difference is real and worth stating precisely. A selector-based scraper is deterministic and cheap per page: once the selector is right, the same input yields the same output, and a broken extraction is a visible exception rather than a quietly wrong field. A prompt-based extractor inverts that. It tolerates layout drift, which is exactly the failure mode that breaks selectors, but it gives up determinism and per-page cost predictability. If your target pages are stable and your schema is fixed, selectors remain the better engineering choice and this repository offers nothing you need. The second comparison is against running your own retrieval and inference stack, for example fetching pages yourself and sending them to a model you control. That path costs you the browser fleet, the proxy rotation and the search augmentation, all of which this endpoint bundles, but it gives you model choice, logging of every intermediate step, and the ability to cache and replay. The honest framing is that ScrapingBee is selling the operational layer, not the intelligence. You are buying page retrieval, geotargeted search and HTML injection behind one credential, and paying for that convenience with opacity and per-call billing.

Maintenance surface, licensing and what the repository does not tell you

The maintenance story is short because there is almost nothing to maintain locally. No browser automation, no selector logic, per the README. Your upgrade exposure is the scrapingbee npm package and the hosted endpoint's behaviour, not this repository. That cuts both ways: you inherit whatever the endpoint does next, and you have no version pin in the material provided to freeze against. The repository lists no releases, no licence file and no primary language in the metadata supplied, so the licensing terms of the code itself cannot be stated here. The service it calls is commercial and credential-gated, and the SDK example hardcodes an API key placeholder, which means key handling is your responsibility. The README does not describe authentication beyond the bearer token, does not state a data retention policy for prompts and injected HTML, and does not say whether submitted page content is used for anything beyond the response. If you are extracting anything sensitive or contractually restricted, those are questions for ScrapingBee's terms rather than for this repository, and they are not answered in the material available. Nothing here constitutes legal advice; read the service terms and the repository licence directly before relying on either.

A concrete way to evaluate it in an afternoon

Because the repository ships no test harness, the evaluation has to be built around the two documented call shapes. Start with the Python route against a single page you already parse with selectors, sending the same field list in prompt with add_html true and search false, and diff the returned JSON against your existing extractor's output. Then repeat the identical call ten times and compare field types and formatting across runs; that tells you how much validation you need to write. Next, flip search to true on a query where freshness matters and check whether country_code changes the result set in the way you expect. Finally, deliberately trigger a 429 by running the calls concurrently and observe what the endpoint returns, since the README names the code but not the retry semantics. If the field-level diffs are clean and the repeated calls are stable enough for your schema, the maintenance trade is worth it. If formatting drifts between runs, you are looking at a validation layer that costs more to build than the selectors you were trying to escape.

Editorial conclusion

Adopt this if you already hold ScrapingBee credentials, your extraction targets change layout often, and you are willing to pay per call for a model to do the parsing. Do not adopt it if you need on-premise inference, deterministic output schemas, or a per-field audit trail, because the repository exposes no model choice, no temperature or seed control, and no schema enforcement beyond what you write in the prompt. Before committing, verify three things against your own account: the response shape that client.chatGPT() actually returns in the current SDK version, whether add_html counts against the same credit pool as a normal rendered request, and what the 429 behaviour looks like under your real concurrency. The repository itself ships no tests, no CI configuration and no version pin, so the only artefact you can audit is the README.

Official sources

  1. Issues
  2. Project website
  3. README
  4. ScrapingBee/chatgpt-scraper-api on GitHub
Community notes

Community notes