# Website Content Fetcher | $0.25/1K Pages (`litescrape/web-fetch`) Actor

Fetch any public web page as clean Markdown, text or HTML with title and metadata. Optional selectors and link or image summaries. One page per request. $0.25 per 1k requests, run usage included.

- **URL**: https://apify.com/litescrape/web-fetch.md
- **Developed by:** [Lite Scraper](https://apify.com/litescrape) (community)
- **Categories:** AI, Developer tools
- **Stats:** 2 total users, 1 monthly users, 50.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.25 / 1,000 successful api requests

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Website Content Fetcher | $0.25/1K Pages

Fetch any public web page as clean Markdown, text or HTML with title and metadata. Optional selectors and link or image summaries. One page per request. $0.25 per 1k requests, run usage included.

One web page rendered and returned as Markdown, text or HTML with metadata.

### Price

**$0.25 per 1,000 pages** ($0.00025 per successful API response). A page is one successful source response. Each continuation page is billed separately; individual records cost no extra.

Each successful response saved to the run is one paid event, including valid empty responses. Multiple places, reviews, or products in one response do not create additional paid events.

Failed requests are unbilled. JSON output is saved before successful responses are charged together. Recovery never recharges an ambiguous payment after its safe retry window; the saved output remains available for reconciliation. There is no Actor startup fee or separate per-row fee; platform usage during the run is included. Standard Apify charges for post-run storage access may still apply. Payments are handled by Apify; no separate service key or proxy purchase is required.

Free-plan users receive up to 25 successful requests per Apify user per UTC day across this catalog, subject to the service trial allowance. Paid runs respect the input request limit and Apify spending limit.

### Quick start

Use a single input below, or supply `requests` as a list of parameter objects. Top-level API fields are shared defaults, and each batch object overrides them. Identifiers in examples demonstrate the format; use an identifier returned by the matching provider for production work.

```json
{
  "url": "https://example.com",
  "respond_with": "markdown",
  "maxRequests": 10,
  "maxPagesPerInput": 1
}
```

### Input parameters

| Field | Type | Required | Meaning |
| --- | --- | --- | --- |
| `url` | string | Required per input | Public HTTP(S) URL to capture, 1-8,192 characters. Include http:// or https://; bare domains are rejected. The host must be public, on port 80 or 443, without embedded credentials. |
| `respond_with` | string | Optional / conditional | Output format: content (default; main content as Markdown, or the whole page when extraction keeps too little), markdown (whole page as Markdown), html, text, frontmatter (content plus front matter), or a '+' combination such as markdown+frontmatter. For screenshots use /api/web/screenshot. |
| `assert_status_code` | integer | Optional / conditional | Expected origin HTTP status, 100-599. A different status is rejected; otherwise a rendered error page is a successful capture. |
| `base` | string | Optional / conditional | Resolve relative links against the requested URL (initial, default) or the final URL after redirects (final). |
| `detach_invisibles` | boolean | Optional / conditional | Drop display:none elements from the page. |
| `engine` | string | Optional / conditional | auto (default; lightweight HTTP first, a browser when needed), browser, or curl (no JavaScript). |
| `inject_frame_script` | array | Optional / conditional | 1-8 scripts (source, or a URL to a script), up to 8,192 characters each, run in every frame. |
| `inject_page_script` | array | Optional / conditional | 1-8 scripts (source, or a URL to a script), up to 8,192 characters each, run in the main frame. |
| `keep_img_data_url` | boolean | Optional / conditional | Keep inline data: images in Markdown. |
| `locale` | string | Optional / conditional | Browser locale as a language tag, 2-64 characters. Defaults to the browser's own. |
| `markdown` | object | Optional / conditional | Markdown formatting options. |
| `markdown_chunking` | string | Optional / conditional | true, h1-h5, structured or s1-s5: split the Markdown and return chunks. |
| `max_tokens` | integer | Optional / conditional | Integer 500-10,000,000. Trim content to this many tokens. |
| `no_gfm` | boolean | Optional / conditional | true, false or table: disable GitHub-flavored Markdown, or only its tables. |
| `page_timeout` | integer | Optional / conditional | Seconds from 1 through 180 for page loading and browser operations. Cannot extend the total request budget set by timeout. |
| `preset` | string | Optional / conditional | Option preset. Fills only the options the request leaves unset. |
| `referer` | string | Optional / conditional | HTTP(S) URL sent as the Referer. |
| `remove_overlay` | boolean | Optional / conditional | Remove modal and cookie-banner overlays from the page. |
| `remove_selector` | string | Optional / conditional | CSS selector removed before extraction, 1-2,048 characters; POST also accepts a list of 1-16 selectors. |
| `respond_timing` | string | Optional / conditional | Page readiness condition to reach before responding. |
| `retain_images` | string | Optional / conditional | Images to keep: all (default), alt (alt text only) or none. |
| `retain_links` | string | Optional / conditional | Links to keep: all (default), text (link text only), none, or gpt-oss (citation format with a links summary). |
| `retain_media` | string | Optional / conditional | How video, audio and embedded video appear: none, text, link (default), image or html. |
| `robots_txt` | string | Optional / conditional | User agent, 1-256 characters, to check against the site's robots.txt; disallowed URLs are rejected. |
| `set_cookies` | array | Optional / conditional | 1-100 cookies in Set-Cookie syntax (name=value; Path=/; Domain=...), one line each, up to 4,096 characters. |
| `target_selector` | string | Optional / conditional | CSS selector to extract, 1-2,048 characters; POST also accepts a list of 1-16 selectors. Implies waiting for the selector. Match-all selectors are rejected. |
| `timeout` | number | Optional / conditional | Total request execution budget in seconds, greater than 0 and at most 90. Supply in the query string for GET or POST. page_timeout cannot extend this budget. |
| `token_budget` | integer | Optional / conditional | Integer 1-10,000,000. Reject the page when its token count exceeds the budget. |
| `user_agent` | string | Optional / conditional | User-Agent for the page request, 1-1,024 characters without control characters. Defaults to the browser's own. |
| `viewport` | object | Optional / conditional | Browser viewport; width and height are required. Default: 1280 x 1280. |
| `wait_for_selector` | string | Optional / conditional | CSS selector to wait for after navigation, 1-2,048 characters. POST also accepts a list of 1-16 selectors. |
| `with_iframe` | boolean | Optional / conditional | true, false or quoted: include iframe content before extraction. |
| `with_images_summary` | boolean | Optional / conditional | Add an images list to the response. |
| `with_links_summary` | boolean | Optional / conditional | true, false or all: add a links list to the response. |
| `with_shadow_dom` | boolean | Optional / conditional | Include open shadow DOM content before extraction. |

The source validates conditional parameter combinations. Validation errors do not trigger a paid request event. Provider availability determines which optional result groups appear.

### Batches, pagination, and limits

- `requests`: up to 1,000 input parameter objects in one run.
- `maxRequests`: total successful API requests, including pages; default 100. At that limit the event price is at most $0.025.
- `maxPagesPerInput`: default 1. Increase to follow native continuation links where this endpoint supplies them. No synthetic pagination is invented.
- `maxResults`: maximum dataset rows; default 1,000. Already in-flight requests can complete and be billed, with full JSON saved even if their rows exceed this cap.
- `maxConcurrency`: default 2, maximum 8. Service capacity and trial limits may reduce it.
- `includeArtifacts`: optionally retain available raw source artifacts in this run. Default false.
- `datasetOutput`: default false. Enable the dataset/export workflow; pagination and artifacts select it automatically. JSON mode uses 128 MB, allows up to 1 MiB per upstream response and 8 MiB total output. Use dataset output for larger responses.

### Output

The default JSON workflow saves one `OUTPUT` record with `successfulRequests`, `failedRequests`, and ordered `results`. Each result contains `requestId`, `statusCode`, and the complete source JSON in `body`. Use the run-sync API to return `OUTPUT` directly. It does not create dataset rows or per-request response copies.

With `datasetOutput: true`, pagination, or artifacts enabled, the default dataset contains source records with `requestId`, `inputIndex`, `page`, `group`, readable `title`, `url`, `rating`, and `text` fields when available, the complete record in `data`, and `responseUrl`. A successful response without a primary result group gets a response row.

In the dataset workflow, each `responseUrl` points to a stored response envelope; its `response.body` contains the complete API JSON, including optional modules and pagination. `SUMMARY` reports successful requests, failures, row count, and event charges. `ERRORS` records unsuccessful requests. If every request fails, the run fails with no request-event charges.

Follow-up API links, including pagination and related reviews or products, are Apify request objects: `{ "url": "https://api.apify.com/v2/actors/litescrape~<actor>/runs", "method": "POST", "input": { ... } }`. POST the supplied `input` as JSON to `url` using your own Apify authorization header. Each follow-up starts a new run limited to one successful request; use `maxPagesPerInput` for automatic pagination inside this run. Source website links are unchanged. `search_metadata.json_endpoint` links to the saved Apify response. Available artifact links point to files copied to Apify; unavailable artifact links are omitted.

JSON exports preserve nested fields. Select the flat overview fields for CSV. Artifact manifests use `artifacts-<requestId>` keys and link to copied source files when available. Private run data requires the appropriate Apify access.

### Price comparison

**Price comparison (2026-10-19):** One request fetches one page. Paid Store fetchers list per-page prices from $0.00001 plus a small run start, below our $0.00025 per page, so no cheapest claim is made.

**Illustrative workload:** 1,000 successful requests × 1 usable pages per request = 1,000 pages. Our total is **$0.25**, equivalent to **$0.25 per 1,000 pages**.

These are calculated prices, not measured scraper runs or guaranteed page yields. Count unique usable source records actually delivered, including the cost of empty responses, continuation pages and lookups needed to obtain the fields you need. An array of request objects does not turn multiple API calls into one billed request.

| Actor | Lowest applicable tier | Published-charge subtotal for this workload | Effective price / 1,000 output units |
| --- | --- | ---: | ---: |
| **Litescrape** | Same request rate on every plan | **$0.25** | **$0.25** |
| [enchantingly_lockbox/universal-webpage-to-clean-markdown-for-ai-rag](https://apify.com/enchantingly_lockbox/universal-webpage-to-clean-markdown-for-ai-rag) ([active prices](https://api.apify.com/v2/acts/enchantingly_lockbox~universal-webpage-to-clean-markdown-for-ai-rag)) | FREE | $0.01005 | $0.01005 |
| [fetch_cat/web-page-to-markdown-extractor](https://apify.com/fetch_cat/web-page-to-markdown-extractor) ([active prices](https://api.apify.com/v2/acts/fetch_cat~web-page-to-markdown-extractor)) | DIAMOND | $0.050108 | $0.050108 |
| [6sigmag/fast-website-content-crawler](https://apify.com/6sigmag/fast-website-content-crawler) ([active prices](https://api.apify.com/v2/acts/6sigmag~fast-website-content-crawler)) | FREE | $3.0015 | $3.0015 |
| [shelvick/smart-page-fetcher](https://apify.com/shelvick/smart-page-fetcher) ([active prices](https://api.apify.com/v2/acts/shelvick~smart-page-fetcher)) | GOLD | $0.425 | $0.425 |

Each competitor gets its lowest published tier, including enterprise tiers, without adding a plan subscription cost. Required compared events use the same tier; known startup charges assume one run and the minimum one billed GB. Unquantified compute/proxy charges, optional enrichment and any omitted additional fees can only increase the displayed competitor subtotal. Output completeness and reliability were not benchmarked.

Cheapest means the lowest calculated price for the stated workload among the named paid Apify Actors in this dated audit. It is not a claim about every Actor, every plan, every workload, or equal output quality. Free/platform-only Actors, monthly rentals and bring-your-own-paid-key wrappers do not establish a comparable fixed total from their Actor fee alone. They may cost less on particular workloads.

The comparison uses the linked active pricing snapshots and public documentation checked on the audit date. Recheck live pricing before relying on a competitor comparison. No provider affiliation or equal-quality claim is implied.

### Support

Use this Actor's Issues tab on Apify and include the run ID plus a description of the unexpected result. Do not post credentials.

This is an independent tool from Litescrape. Provider names identify the source; they do not imply affiliation or endorsement.

# Actor input Schema

## `url` (type: `string`):

Public HTTP(S) URL to capture, 1-8,192 characters. Include http:// or https://; bare domains are rejected. The host must be public, on port 80 or 443, without embedded credentials.

## `respond_with` (type: `string`):

Output format: content (default; main content as Markdown, or the whole page when extraction keeps too little), markdown (whole page as Markdown), html, text, frontmatter (content plus front matter), or a '+' combination such as markdown+frontmatter. For screenshots use /api/web/screenshot.

## `assert_status_code` (type: `integer`):

Expected origin HTTP status, 100-599. A different status is rejected; otherwise a rendered error page is a successful capture.

## `base` (type: `string`):

Resolve relative links against the requested URL (initial, default) or the final URL after redirects (final).

## `detach_invisibles` (type: `boolean`):

Drop display:none elements from the page.

## `engine` (type: `string`):

auto (default; lightweight HTTP first, a browser when needed), browser, or curl (no JavaScript).

## `inject_frame_script` (type: `array`):

1-8 scripts (source, or a URL to a script), up to 8,192 characters each, run in every frame.

## `inject_page_script` (type: `array`):

1-8 scripts (source, or a URL to a script), up to 8,192 characters each, run in the main frame.

## `keep_img_data_url` (type: `boolean`):

Keep inline data: images in Markdown.

## `locale` (type: `string`):

Browser locale as a language tag, 2-64 characters. Defaults to the browser's own.

## `markdown` (type: `object`):

Markdown formatting options.

## `markdown_chunking` (type: `string`):

true, h1-h5, structured or s1-s5: split the Markdown and return chunks.

## `max_tokens` (type: `integer`):

Integer 500-10,000,000. Trim content to this many tokens.

## `no_gfm` (type: `boolean`):

true, false or table: disable GitHub-flavored Markdown, or only its tables.

## `page_timeout` (type: `integer`):

Seconds from 1 through 180 for page loading and browser operations. Cannot extend the total request budget set by timeout.

## `preset` (type: `string`):

Option preset. Fills only the options the request leaves unset.

## `referer` (type: `string`):

HTTP(S) URL sent as the Referer.

## `remove_overlay` (type: `boolean`):

Remove modal and cookie-banner overlays from the page.

## `remove_selector` (type: `string`):

CSS selector removed before extraction, 1-2,048 characters; POST also accepts a list of 1-16 selectors.

## `respond_timing` (type: `string`):

Page readiness condition to reach before responding.

## `retain_images` (type: `string`):

Images to keep: all (default), alt (alt text only) or none.

## `retain_links` (type: `string`):

Links to keep: all (default), text (link text only), none, or gpt-oss (citation format with a links summary).

## `retain_media` (type: `string`):

How video, audio and embedded video appear: none, text, link (default), image or html.

## `robots_txt` (type: `string`):

User agent, 1-256 characters, to check against the site's robots.txt; disallowed URLs are rejected.

## `set_cookies` (type: `array`):

1-100 cookies in Set-Cookie syntax (name=value; Path=/; Domain=...), one line each, up to 4,096 characters.

## `target_selector` (type: `string`):

CSS selector to extract, 1-2,048 characters; POST also accepts a list of 1-16 selectors. Implies waiting for the selector. Match-all selectors are rejected.

## `timeout` (type: `number`):

Total request execution budget in seconds, greater than 0 and at most 90. Supply in the query string for GET or POST. page_timeout cannot extend this budget.

## `token_budget` (type: `integer`):

Integer 1-10,000,000. Reject the page when its token count exceeds the budget.

## `user_agent` (type: `string`):

User-Agent for the page request, 1-1,024 characters without control characters. Defaults to the browser's own.

## `viewport` (type: `object`):

Browser viewport; width and height are required. Default: 1280 x 1280.

## `wait_for_selector` (type: `string`):

CSS selector to wait for after navigation, 1-2,048 characters. POST also accepts a list of 1-16 selectors.

## `with_iframe` (type: `boolean`):

true, false or quoted: include iframe content before extraction.

## `with_images_summary` (type: `boolean`):

Add an images list to the response.

## `with_links_summary` (type: `boolean`):

true, false or all: add a links list to the response.

## `with_shadow_dom` (type: `boolean`):

Include open shadow DOM content before extraction.

## `requests` (type: `array`):

Optional list of parameter objects. Top-level API fields are shared defaults; each object overrides them. Maximum 1,000 inputs.

## `maxRequests` (type: `integer`):

Run-wide cap on successful API requests, including continuation pages. 1,000 requests cost $0.25.

## `maxResults` (type: `integer`):

Cap exported rows. An in-flight response can still be saved and billed in full. Complete JSON responses remain in storage.

## `maxPagesPerInput` (type: `integer`):

1 returns the first page only. Additional pages follow source continuation links when available; every successful page is a paid request.

## `maxConcurrency` (type: `integer`):

Upper concurrency bound. The service may apply a lower limit for capacity or trial quotas.

## `includeArtifacts` (type: `boolean`):

Copy available raw source artifacts to this run. Availability varies by endpoint; unavailable artifacts do not invalidate a saved JSON response.

## `datasetOutput` (type: `boolean`):

Enable dataset rows and recoverable per-request storage. Leave off for the cheapest JSON output. Pagination and artifacts also enable this workflow.

## Actor input object example

```json
{
  "url": "https://example.com",
  "respond_with": "markdown",
  "maxRequests": 100,
  "maxResults": 1000,
  "maxPagesPerInput": 1,
  "maxConcurrency": 2,
  "includeArtifacts": false,
  "datasetOutput": false
}
```

# Actor output Schema

## `json` (type: `string`):

No description

## `results` (type: `string`):

No description

## `summary` (type: `string`):

No description

## `errors` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "url": "https://example.com",
    "respond_with": "markdown"
};

// Run the Actor and wait for it to finish
const run = await client.actor("litescrape/web-fetch").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "url": "https://example.com",
    "respond_with": "markdown",
}

# Run the Actor and wait for it to finish
run = client.actor("litescrape/web-fetch").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "url": "https://example.com",
  "respond_with": "markdown"
}' |
apify call litescrape/web-fetch --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,litescrape/web-fetch"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/owzASofebPGmNDsWt/builds/7Vhoz43ELIXjMKOOj/openapi.json
