# Scrapeless

> Read web pages that block ordinary requests, crawl whole sites, and search Google (the web, news, images, videos, shopping, local places and patents), all as clean data. Look up Amazon products and sellers, and capture what ChatGPT, Perplexity, Gemini, Grok, Copilot and Google's AI answers say about anything you ask.

App · AI Agents · 12 actions. Web page: https://docs.lodol.com/docs/integrations/scrapeless

## Actions

### Ask an AI assistant

Ask ChatGPT, Perplexity, Gemini, Grok, Microsoft Copilot, Google AI Mode or Google AI Overview a question and get back the answer they would give a real person, with the sources they cited. Use it to watch what the assistants say about a brand, a product or a competitor.

**Inputs**

- Ask (`assistant`, text, required): Which assistant should answer. One of: `chatgpt`, `perplexity`, `gemini` (Google Gemini), `grok`, `copilot` (Microsoft Copilot), `google_ai_mode` (Google AI Mode), `google_ai_overview` (Google AI Overview). Default: `chatgpt`.
- Question (`prompt`, text, required): What to ask, exactly as a person would type it.
- Asked from (`country`, text): The country to ask from. Assistants answer differently by market, so this changes what comes back. One of: `AL` (Albania), `DZ` (Algeria), `AO` (Angola), `AR` (Argentina), `AM` (Armenia), `AW` (Aruba), `AU` (Australia), `AT` (Austria), `AZ` (Azerbaijan), `BH` (Bahrain), and 129 more. Default: `US`.
- Let it search the web (`search_the_web`, true/false): Ask for an answer backed by a live web search. Only ChatGPT and Perplexity can be asked either way; the rest always search. Default: `true`.
- Include product recommendations (`include_products`, true/false): Bring back the products and merchant offers behind a shopping answer. Scrapeless charges twice as much for a reply that carries them. Applies to ChatGPT, Gemini, Google AI Mode and Google AI Overview. Default: `false`.

**Outputs**

- `answer` (text): The answer, as Markdown.
- `assistant` (text): Which assistant answered.
- `full_answer` (object): Everything the assistant returned, including follow-up suggestions and media.
- `products` (list): The products recommended, when they were asked for.
- `prompt` (text): The question that was asked.
- `sources` (list): The pages the answer cited.

**Example output**

```json
{
  "answer": "Several tools stand out, depending on...",
  "assistant": "ChatGPT",
  "full_answer": {
    "model": "gpt-5-1"
  },
  "products": [],
  "prompt": "What is the best tool for web scraping?",
  "sources": [
    {
      "title": "Best web scraping tools",
      "url": "https://example.com/tools"
    }
  ]
}
```

### Check a crawl

See how far a crawl has got and read the pages it has gathered so far. Check 'is_finished' to know whether more is still coming.

**Inputs**

- Crawl (`crawl_id`, text, required): The crawl's id, as given back by 'Crawl a site'.

**Outputs**

- `crawl_id` (text): The crawl checked.
- `error` (text): Why the crawl stopped, if it failed.
- `is_finished` (true/false): True once the crawl has stopped running.
- `page_count` (number): How many pages are in this response.
- `pages` (list): The pages gathered so far, text and all.
- `pages_found` (number): How many pages the crawl knows about.
- `pages_read` (number): How many pages have been read.
- `status` (text): Where the crawl is up to.

**Example output**

```json
{
  "crawl_id": "3a6f1d90-2b4c-4f1e-9f3a-8c2d5e7b1a04",
  "error": null,
  "is_finished": true,
  "page_count": 1,
  "pages": [
    {
      "description": "Plans and prices.",
      "error": null,
      "html": null,
      "links": [
        "https://example.com/signup"
      ],
      "metadata": {
        "statusCode": 200,
        "title": "Pricing"
      },
      "raw_html": null,
      "screenshot": null,
      "status_code": 200,
      "text": "# Pricing\n\nStarter is $19 a month...",
      "title": "Pricing",
      "url": "https://example.com/pricing"
    }
  ],
  "pages_found": 1,
  "pages_read": 1,
  "status": "completed"
}
```

### Check your Scrapeless credit

See how much credit is left on the connected Scrapeless account and when the plan renews. Costs nothing to call, so it also makes a good first step for checking the connection still works.

**Inputs**: None.

**Outputs**

- `account_id` (text): Scrapeless's id for the account.
- `credits` (number): Credit left on the account.
- `extra_credits` (number): Credit bought on top of the plan.
- `is_active` (true/false): Whether the account is in good standing.
- `plan_credits` (number): Credit left in this month's plan.
- `plan_price` (number): What the plan costs.
- `plan_renews_on` (text): When the current plan period ends.

**Example output**

```json
{
  "account_id": "fad03c7e-0000-0000-b066-ece80f03d5d5",
  "credits": 82.15,
  "extra_credits": 0.0,
  "is_active": true,
  "plan_credits": 0.0,
  "plan_price": 0.0,
  "plan_renews_on": "2026-10-18T23:59:59.999Z"
}
```

### Crawl a site

Read a whole site by following its links, and get the text of every page. The crawl is not finished when this step is: it keeps running in the background, so follow this with a Wait step and 'Check a crawl'.

**Inputs**

- Start at (`url`, text, required): Where the crawl begins. Everything under this address is followed; start at a section to crawl only that section.
- Stop after (`page_limit`, number): The most pages to read. Each page costs credit, so start small and raise it once the results look right. From 1 to 1000. Default: `10`.
- Only pages matching (`include_paths`, list): Read only the pages whose address matches one of these patterns, such as blog/.* for everything under /blog/. Leave empty to read everything found.
- Skip pages matching (`exclude_paths`, list): Leave out the pages whose address matches one of these patterns, such as tag/.* for tag listings.
- Leave the starting section (`follow_links_above_start`, true/false): Follow links that point outside where the crawl started, such as a link from /docs/ to /pricing. Still stays on the same site. Default: `false`.
- Follow links to other sites (`follow_external_links`, true/false): Let the crawl leave this site altogether. Use with a small page limit: the web has no edges. Default: `false`.
- Pause between pages (`pause_seconds`, number): Seconds to wait between pages, to go easy on a small site. Leave at 0 to crawl at full speed. From 0 to 30. Default: `0`.
- Bring back (`formats`, list): What each page should come back as. Readable text is Markdown with the navigation stripped out, which is what most steps want. One or more of: `markdown` (Readable text), `html` (Tidied HTML), `rawHtml` (Raw HTML), `links` (Every link on the page), `screenshot`, `screenshot@fullPage` (Full-page screenshot). Default: `["markdown"]`.
- Skip navigation and footers (`main_content_only`, true/false): Keep only the main body of each page. Turn this off when the part you need lives in a sidebar, a header or a footer. Default: `true`.
- Browse from (`proxy_country`, text): Load the page from an address in this country. Use it when a site shows different prices, stock or news depending on where the reader is. Anywhere lets Scrapeless pick. One of: `ANY` (Anywhere), `AL` (Albania), `DZ` (Algeria), `AO` (Angola), `AR` (Argentina), `AM` (Armenia), `AW` (Aruba), `AU` (Australia), `AT` (Austria), `AZ` (Azerbaijan), and 130 more. Default: `ANY`.

**Outputs**

- `crawl_id` (text): Pass this to 'Check a crawl' to read the pages.
- `page_limit` (number): The most pages this crawl will read.
- `url` (text): Where the crawl started.

**Example output**

```json
{
  "crawl_id": "3a6f1d90-2b4c-4f1e-9f3a-8c2d5e7b1a04",
  "page_limit": 10,
  "url": "https://example.com/docs/"
}
```

### Fetch a page's source

Get a page exactly as the site sends it: the HTML source, or the raw JSON behind an address that answers with data. Use 'Read a page' when you want readable text instead.

**Inputs**

- Address (`url`, text, required): The address to fetch.
- Let the page run its scripts (`run_javascript`, true/false): Load the page in a browser first, so anything the page draws for itself is in the source. Turn it off for an address that answers with data, which is quicker and cheaper. Default: `true`.
- Browse from (`proxy_country`, text): Load the page from an address in this country. Use it when a site shows different prices, stock or news depending on where the reader is. Anywhere lets Scrapeless pick. One of: `ANY` (Anywhere), `AL` (Albania), `DZ` (Algeria), `AO` (Angola), `AR` (Argentina), `AM` (Armenia), `AW` (Aruba), `AU` (Australia), `AT` (Austria), `AZ` (Azerbaijan), and 130 more. Default: `ANY`.

**Outputs**

- `content` (text): What the site sent back, unchanged.
- `content_length` (number): How many characters came back.
- `javascript_ran` (true/false): Whether the page was rendered in a browser.
- `url` (text): The address fetched.

**Example output**

```json
{
  "content": "<!doctype html><html><head><title>Example</title>...",
  "content_length": 1256,
  "javascript_ran": true,
  "url": "https://example.com"
}
```

### List the pages a crawl missed

See which pages a crawl could not read and why, and which ones the site's robots.txt told it to leave alone. Use it when a crawl came back smaller than expected.

**Inputs**

- Crawl (`crawl_id`, text, required): The crawl's id, as given back by 'Crawl a site'.

**Outputs**

- `blocked_by_robots` (list): Addresses the site's robots.txt ruled out.
- `blocked_count` (number): How many addresses robots.txt ruled out.
- `crawl_id` (text): The crawl checked.
- `failed_count` (number): How many pages failed.
- `failed_pages` (list): Each page that failed, with its address and reason.

**Example output**

```json
{
  "blocked_by_robots": [
    "https://example.com/docs/internal"
  ],
  "blocked_count": 1,
  "crawl_id": "3a6f1d90-2b4c-4f1e-9f3a-8c2d5e7b1a04",
  "failed_count": 1,
  "failed_pages": [
    {
      "error": "404 Not Found",
      "id": "9d1f",
      "timestamp": "2026-09-18T10:31:00Z",
      "url": "https://example.com/docs/old"
    }
  ]
}
```

### Look up an Amazon listing

Read an Amazon product or seller page as data: title, price, stock, rating, reviews, images and specifications. Paste any Amazon product or seller link and Scrapeless reads the right kind of page.

**Inputs**

- Amazon link (`url`, text, required): The product or seller page to read, from any Amazon site.
- Deliver to (`delivery_postcode`, text): A postcode or ZIP code to price the products for. Amazon shows different prices, stock and delivery dates by address.

**Outputs**

- `kind` (text): Whether it was a product or a seller page.
- `listing` (object): Everything Amazon shows on that page, as data.
- `url` (text): The page that was read.

**Example output**

```json
{
  "kind": "product",
  "listing": {
    "price": "$328.00",
    "rating": 4.6,
    "reviews": 8123,
    "title": "Wireless Noise Cancelling Headphones"
  },
  "url": "https://www.amazon.com/dp/B0BQXHK363"
}
```

### Read a page

Get a web page's text, even when the site blocks ordinary requests. Scrapeless loads the page in a real browser, solves any challenge in the way, and hands back clean readable text ready for the next step.

**Inputs**

- Page address (`url`, text, required): The address of the page to read.
- Bring back (`formats`, list): What each page should come back as. Readable text is Markdown with the navigation stripped out, which is what most steps want. One or more of: `markdown` (Readable text), `html` (Tidied HTML), `rawHtml` (Raw HTML), `links` (Every link on the page), `screenshot`, `screenshot@fullPage` (Full-page screenshot). Default: `["markdown"]`.
- Skip navigation and footers (`main_content_only`, true/false): Keep only the main body of each page. Turn this off when the part you need lives in a sidebar, a header or a footer. Default: `true`.
- Wait before reading (`wait_seconds`, number): Seconds to let the page finish loading before the text is taken. Raise it for a page that fills itself in after it opens. From 0 to 30. Default: `0`.
- Browse from (`proxy_country`, text): Load the page from an address in this country. Use it when a site shows different prices, stock or news depending on where the reader is. Anywhere lets Scrapeless pick. One of: `ANY` (Anywhere), `AL` (Albania), `DZ` (Algeria), `AO` (Angola), `AR` (Argentina), `AM` (Armenia), `AW` (Aruba), `AU` (Australia), `AT` (Austria), `AZ` (Azerbaijan), and 130 more. Default: `ANY`.

**Outputs**

- `description` (text): The page's own one-line summary, where it has one.
- `error` (text): What went wrong with this page, if anything did.
- `html` (text): The page's tidied HTML.
- `links` (list): Every link on the page.
- `metadata` (object): Everything else the page declared about itself.
- `raw_html` (text): The page's HTML exactly as sent.
- `screenshot` (text): A picture of the page, where one was asked for.
- `status_code` (number): The HTTP status the site answered with.
- `text` (text): The page's readable text, as Markdown.
- `title` (text): The page's title.
- `url` (text): The address the text came from.

**Example output**

```json
{
  "description": "Plans and prices.",
  "error": null,
  "html": null,
  "links": [
    "https://example.com/signup"
  ],
  "metadata": {
    "statusCode": 200,
    "title": "Pricing"
  },
  "raw_html": null,
  "screenshot": null,
  "status_code": 200,
  "text": "# Pricing\n\nStarter is $19 a month...",
  "title": "Pricing",
  "url": "https://example.com/pricing"
}
```

### Read several pages

Read up to 25 pages in one step and get one entry back per page. Faster than reading them one at a time, and an address that turns out not to be a page is skipped rather than failing the run.

**Inputs**

- Page addresses (`urls`, list, required): The pages to read, up to 25. Feed this the links from an earlier step.
- Bring back (`formats`, list): What each page should come back as. Readable text is Markdown with the navigation stripped out, which is what most steps want. One or more of: `markdown` (Readable text), `html` (Tidied HTML), `rawHtml` (Raw HTML), `links` (Every link on the page), `screenshot`, `screenshot@fullPage` (Full-page screenshot). Default: `["markdown"]`.
- Skip navigation and footers (`main_content_only`, true/false): Keep only the main body of each page. Turn this off when the part you need lives in a sidebar, a header or a footer. Default: `true`.
- Wait before reading (`wait_seconds`, number): Seconds to let the page finish loading before the text is taken. Raise it for a page that fills itself in after it opens. From 0 to 30. Default: `0`.
- Browse from (`proxy_country`, text): Load the page from an address in this country. Use it when a site shows different prices, stock or news depending on where the reader is. Anywhere lets Scrapeless pick. One of: `ANY` (Anywhere), `AL` (Albania), `DZ` (Algeria), `AO` (Angola), `AR` (Argentina), `AM` (Armenia), `AW` (Aruba), `AU` (Australia), `AT` (Austria), `AZ` (Azerbaijan), and 130 more. Default: `ANY`.

**Outputs**

- `page_count` (number): How many pages came back.
- `pages` (list): One entry per page, in the order asked for.
- `skipped_urls` (list): Addresses Scrapeless could not treat as pages.

**Example output**

```json
{
  "page_count": 1,
  "pages": [
    {
      "description": "Plans and prices.",
      "error": null,
      "html": null,
      "links": [
        "https://example.com/signup"
      ],
      "metadata": {
        "statusCode": 200,
        "title": "Pricing"
      },
      "raw_html": null,
      "screenshot": null,
      "status_code": 200,
      "text": "# Pricing\n\nStarter is $19 a month...",
      "title": "Pricing",
      "url": "https://example.com/pricing"
    }
  ],
  "skipped_urls": []
}
```

### Search Amazon

Search any Amazon site for products and get back the listings with their prices, ratings, review counts and links; the search page as data.

**Inputs**

- Search for (`keywords`, text, required): What to search Amazon for.
- On (`site`, text): Which Amazon site to search. One of: `com` (Amazon.com (United States)), `co.uk` (Amazon.co.uk (United Kingdom)), `de` (Amazon.de (Germany)), `fr` (Amazon.fr (France)), `it` (Amazon.it (Italy)), `es` (Amazon.es (Spain)), `nl` (Amazon.nl (Netherlands)), `se` (Amazon.se (Sweden)), `pl` (Amazon.pl (Poland)), `com.tr` (Amazon.com.tr (Turkey)), and 9 more. Default: `com`.
- Page (`page`, number): Which page of results to fetch. 1 is the first page, 2 the next, and so on. From 1 to 50. Default: `1`.
- Deliver to (`delivery_postcode`, text): A postcode or ZIP code to price the products for. Amazon shows different prices, stock and delivery dates by address.

**Outputs**

- `full_response` (object): Everything the search page returned.
- `page` (number): The page fetched.
- `product_count` (number): How many products came back.
- `products` (list): The products found, each with its title, price, rating and link.
- `site` (text): The Amazon site that was searched.

**Example output**

```json
{
  "full_response": {
    "results": []
  },
  "page": 1,
  "product_count": 1,
  "products": [
    {
      "asin": "B0BQXHK363",
      "price": "$328.00",
      "rating": 4.6,
      "title": "Wireless Noise Cancelling Headphones"
    }
  ],
  "site": "amazon.com"
}
```

### Search Google

Search Google and get the results as data rather than a page: the web, news, images, videos, shopping, local places or patents, from any country and in any language.

**Inputs**

- Search for (`query`, text, required): What to search for. Anything you would type into Google works, including site: and "quoted phrases".
- Search (`search_in`, text): Which of Google's tabs to search. One of: `web` (The web), `news`, `images`, `videos`, `shopping`, `places` (Local places), `patents`. Default: `web`.
- Search from (`country`, text): Get the results someone in this country would see. Leave it empty and Google decides. One of: `al` (Albania), `dz` (Algeria), `ao` (Angola), `ar` (Argentina), `am` (Armenia), `aw` (Aruba), `au` (Australia), `at` (Austria), `az` (Azerbaijan), `bh` (Bahrain), and 129 more.
- Search in (`language`, text): The language Google should answer in. One of: `ar` (Arabic), `hy` (Armenian), `bg` (Bulgarian), `ca` (Catalan), `zh` (Chinese), `hr` (Croatian), `cs` (Czech), `da` (Danish), `nl` (Dutch), `en` (English), and 31 more.
- Search near (`near`, text): A town or city to search as if you were standing in it, such as Austin, Texas, United States. Worth setting for local places and shopping.
- Results per page (`results_per_page`, number): How many results one page should hold. From 1 to 100. Default: `10`.
- Page (`page`, number): Which page of results to fetch. 1 is the first page, 2 the next, and so on. From 1 to 50. Default: `1`.
- Hide explicit results (`hide_explicit_results`, true/false): Turn Google's SafeSearch on for this search. Default: `false`.

**Outputs**

- `full_response` (object): Everything Google returned, including answer boxes, knowledge panels and ads.
- `page` (number): The page fetched.
- `related_searches` (list): What Google suggests searching next.
- `result_count` (number): How many results came back.
- `results` (list): The results, best first, each with its position, title, address and snippet.
- `search_information` (object): How many results Google has and how long it took.
- `searched_in` (text): Which tab was searched.

**Example output**

```json
{
  "full_response": {
    "organic_results": []
  },
  "page": 1,
  "related_searches": [
    {
      "query": "example domain rfc"
    }
  ],
  "result_count": 1,
  "results": [
    {
      "link": "https://example.com",
      "position": 1,
      "snippet": "This domain is for use in examples.",
      "title": "Example Domain"
    }
  ],
  "search_information": {
    "total_results": 1250000
  },
  "searched_in": "web"
}
```

### Stop a crawl

Stop a crawl that is still running, so it reads no further pages and costs no more credit. The pages it already gathered stay readable with 'Check a crawl'.

**Inputs**

- Crawl (`crawl_id`, text, required): The crawl's id, as given back by 'Crawl a site'.

**Outputs**

- `crawl_id` (text): The crawl stopped.
- `status` (text): What the crawl's state is now.
- `stopped` (true/false): True once Scrapeless has accepted the stop.

**Example output**

```json
{
  "crawl_id": "3a6f1d90-2b4c-4f1e-9f3a-8c2d5e7b1a04",
  "status": "cancelled",
  "stopped": true
}
```
