How it will work: 3 steps
- Follow us on ApifyThe tool is built and waits in the queue for the Apify Store. Apify is the cloud platform where our tools run.
- Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example:
https://apify.comin Page URL. Each start is one run. - Download the resultsWhen the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.
This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.
What it does
Turn any public web page URL into clean, LLM-ready Markdown with the page title, word count and HTTP status.
Good for
- An AI agent or LLM tool needs to read one page as Markdown in one quick call.
- A RAG or summary pipeline needs clean text from a list of known URLs (up to 100 per run).
- A script needs the title, word count and HTTP status of a page together with its text.
Not a good fit
- Whole-site crawling. The Actor reads only the URLs you give; it does not follow links.
- Pages behind a login, paywall or CAPTCHA. The Actor does not log in and does not bypass them.
- Sites with strong bot protection may answer
403. You get anHTTP_ERRORrow, not a bypass. - Private and internal network addresses (for example
localhost,10.x.x.x) are blocked.
Who uses it
AI agent builders
Let an agent read one page as Markdown in one quick call.
RAG pipeline owners
Get clean text from a list of known URLs for your index.
Script writers
Get page text plus title and status in one JSON row.
Price
Prices will be shown after release.
Questions
Does it follow links on the page?
No. It reads only the URLs you give. It does not crawl the site.
Do I pay for pages that fail?
Only a small URL check. Missing, empty or failed pages do not cost the page price.
Why is the Markdown shorter than the page?
Menus, footers and other extras are removed. You get the main content.
Can it read sites with bot protection?
Not always. Some answer 403. You then get an error row, not a bypass.
Do I need a login or an API key for the site?
No. The Actor reads public pages only. You need only your Apify account.
Does it crawl the whole website?
No. It reads exactly the URLs you give. For many pages of one site, first get the page list (for example with a sitemap tool), then pass the URLs here.
Is the text always the same as in my browser?
Not always. Sites can show different content by region, cookies or bot checks. The row shows statusCode and fetchedAt, so you know what the Actor received and when.
Who is responsible for how I use the pages?
You are. Follow the target site's terms and robots rules.
Details
Step by step on Apify
- Open the Input tab.
- Keep the prefilled Page URL
https://apify.comor paste your own page. - Leave Render JavaScript off for normal pages.
- Click Start.
- Open the Output tab. The Markdown view shows
url,titleandmarkdown; the Pages view shows status, HTTP code and word count.
Use cases
| Task | Input | You get | Key fields | Next step |
|---|---|---|---|---|
| Let an AI agent read a page | url | one page | markdown, title, wordCount | Apify MCP server, agent tool call |
| Feed a RAG index from known URLs | urls (up to 100) | one row per page | url, markdown, fetchedAt | API, LangChain, LlamaIndex, n8n |
| Fit a page into an LLM context window | url + maxChars | cut page | markdown, truncated | prompt template |
| Read a JavaScript app page | url + renderJs | rendered page | markdown, renderedJs | same as above |
| Collect links of a page | url + includeLinks | page with links | links, title | crawler or link checker |
Tips for better results
- Turn on JavaScript rendering only for app-like pages. It is slower.
- Set a maximum cost per run. The tool will not start pages it cannot pay for.
- Use our Website to Markdown tool if you need a whole site. This one reads only your links.
Limits and good to know
- A page that does not exist, has no text, needs JavaScript or fails (
not_found,error,NEEDS_JS) costs only the URL checked event. You do not pay the page event - URLs the run did not start (
CHARGE_LIMIT,RUN_TIME_LIMIT,SITES_NOT_RESPONDING) cost nothing - An input error (for example, no URL) costs only the Actor start
- Your maximum cost per run is respected: the Actor does not start a page it cannot pay for and marks the rest
CHARGE_LIMIT - Up to 100 different URLs per run; 5 pages at a time over HTTP, 2 in the browser
- One page: up to 15 seconds per request, 2 attempts, 10 MB of HTML, 5 redirects
- A run stops starting new pages after about 4 minutes, so it fits the default 300-second timeout. If for 60 seconds no site gives a real answer (only timeouts, dropped connections, or server errors 5xx/429), the rest are marked
SITES_NOT_RESPONDINGat no charge - Typical time: about 1–2 seconds for one page on a warm start, up to about 10 seconds on a cold start; about 11 seconds with
renderJs; about 70 seconds for 100 pages
For developers
Sample result
One result from a real test run, in JSON. Real values change from run to run. In Excel or CSV each field is a column.
{
"url": "https://apify.com",
"finalUrl": "https://apify.com/",
"status": "complete",
"statusCode": 200,
"title": "Apify: Marketplace of ready-to-run tools for AI",
"description": "Thousands of tools to automate your business. Get real-time web data, track competitors, generate leads, and integrate your apps and AI agents.",
"language": "en",
"markdown": "# 88,965 tools for your AI\n\nApify is a marketplace of ready-to-run tools for AI. Get real-time web data, track competitors, generate leads, monitor social media, and integrate your apps and agents.\n\n## Popular Actors\n\n…",
"wordCount": 1333,
"truncated": false,
"renderedJs": false,
"fetchedAt": "2026-10-15T19:14:50.149Z",
"error": null
}Data fields (14)
| Field | Type | Meaning |
|---|---|---|
url | string | URL as given in the input. |
finalUrl | string | URL after redirects. null when the page could not be loaded. |
status | string | complete: full Markdown; partial: Markdown cut by maxChars or the page probably needs renderJs; not_found: HTTP 404/410 or no readable text; error: could not fetch (see error). |
statusCode | integer | HTTP status code of the page. |
title | string | Page title. |
description | string | Meta description. |
language | string | Language from <html lang>, e.g. en. |
markdown | string | Main content as Markdown (navigation, headers, footers and cookie banners removed). Starts with '# title' when the page has no H1. null when nothing could be converted. |
wordCount | integer | Words in the Markdown. |
truncated | boolean | True when the Markdown was cut by maxChars or the internal limit. |
renderedJs | boolean | True when the page was rendered in a browser (renderJs). |
links | array | Only with includeLinks: absolute links found on the page. |
fetchedAt | string | When the page was fetched, ISO 8601. |
error | object | Why the row is not complete: code (NOT_FOUND, NEEDS_JS, NO_CONTENT, HTTP_ERROR, TIMEOUT, DNS_ERROR, BLOCKED_URL, INVALID_URL, NOT_HTML, TOO_LARGE, CHARGE_LIMIT, RUN_TIME_LIMIT, SITES_NOT_RESPONDING, …) and message. null when complete. |
Input settings (5)
The main fields of the input form. With the API you send them as JSON.
| Setting | Name in the API | Type | Example value |
|---|---|---|---|
| Page URL | url | string | "https://apify.com" |
| More page URLs | urls | array | |
| Render JavaScript | renderJs | boolean | false |
| Include links | includeLinks | boolean | false |
| Max Markdown characters | maxChars | integer | 0 |
Use cases with this tool
Each guide shows all the steps and the other tools.