Turn a Web Page into Readable Text | TinyFish Fetch
Paste up to 10 public webpage links to get their content as readable text. Pages that require sign-in or block access may be incomplete.
Free
TinyFish
Turn a Web Page into Readable Text | TinyFish Fetch
Paste up to 10 public webpage links to get their content as readable text. Pages that require sign-in or block access may be incomplete.
You receive
The sample returns one page result with requested URL, final URL, title, text, format, language, latency_ms, author, description and published_date. It also retains the errors list.
Start with your task
Get readable text from [one or more public web page links, up to 10].
Inputs & outputs
Inspect the current inputs, availability, and maximum charge before starting.
Input schema
Input schema
Field / Path
Type
Requirement
Meaning
bodybody
object
Required
Required fields
urls
ttlbody.ttl
integer
Optional
Cache freshness tolerance in seconds. Omit to accept any cached entry, 0 to force a live fetch, or a positive number to accept entries younger than that many seconds.
Minimum
0
Maximum
9007199254740991
urlsbody.urls
array
Required
1-10 http(s) URLs to fetch, processed in parallel. Private IPs, localhost, and cloud metadata endpoints are rejected. A failure on one URL never fails the batch — it appears in errors[] instead.
Minimum items
1
Maximum items
10
[]body.urls[]
string
—
Format
uri
linksbody.links
boolean
Optional
Include every <a href> on the page as absolute URLs in the result's `links` array. Defaults to false.
formatbody.format
string
Optional
Output format for each result's `text`. 'markdown' (default) is best for LLM consumption, 'html' returns cleaned semantic HTML, 'json' returns a structured document tree.
Options
markdown, html, json
purposebody.purpose
string
Optional
Optional short statement of the task these results are for — the goal behind the request, not the request itself. TinyFish uses it as an extra ranking signal. Example: 'Compare pricing tiers across vendors for a procurement report'. Max 2000 characters.
Minimum length
1
Maximum length
2000
image_linksbody.image_links
boolean
Optional
Include every <img src> on the page as absolute URLs in the result's `image_links` array. Defaults to false.
if_none_matchbody.if_none_match
string
Optional
An ETag saved from a prior fetch of this URL, forwarded verbatim as the If-None-Match request header. Single URL only. An unchanged page returns not_modified: true instead of a body.
Minimum length
1
exclude_selectorsbody.exclude_selectors
array
Optional
1-20 CSS selectors for elements to remove BEFORE extraction, applied before include_selectors so it also prunes inside selected regions. Entries that match nothing are a no-op.
Minimum items
1
Maximum items
20
[]body.exclude_selectors[]
string
—
Minimum length
1
Maximum length
1000
if_modified_sincebody.if_modified_since
string
Optional
A Last-Modified value saved from a prior fetch of this URL, forwarded verbatim as the If-Modified-Since request header. Single URL only.
Minimum length
1
include_selectorsbody.include_selectors
array
Optional
1-20 CSS selectors scoping extraction to elements matching ANY entry, concatenated in document order. Automatic boilerplate removal is bypassed. A partial miss still succeeds and reports unmatched_selectors; a total miss fails that URL with selector_not_matched plus candidate_selectors retry hints.
Minimum items
1
Maximum items
20
[]body.include_selectors[]
string
—
Minimum length
1
Maximum length
1000
per_url_timeout_msbody.per_url_timeout_ms
integer
Optional
Per-URL wall-clock budget in milliseconds (1-110000). A URL exceeding it returns a 'timeout' entry in errors[] while the rest of the batch still completes.
Return `etag` and `last_modified` on each result so they can be replayed as if_none_match / if_modified_since on a later call. Defaults to false. Fetch does not store them for you. Pair it with ttl=0: validators come from the origin, so a cached hit returns none.
View raw JSON
{
"type": "object",
"required": [
"body"
],
"properties": {
"body": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"urls"
],
"~standard": {
"vendor": "zod",
"version": 1,
"jsonSchema": {}
},
"properties": {
"ttl": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Cache freshness tolerance in seconds. Omit to accept any cached entry, 0 to force a live fetch, or a positive number to accept entries younger than that many seconds."
},
"urls": {
"type": "array",
"items": {
"type": "string",
"format": "uri"
},
"maxItems": 10,
"minItems": 1,
"description": "1-10 http(s) URLs to fetch, processed in parallel. Private IPs, localhost, and cloud metadata endpoints are rejected. A failure on one URL never fails the batch — it appears in errors[] instead."
},
"links": {
"type": "boolean",
"description": "Include every <a href> on the page as absolute URLs in the result's `links` array. Defaults to false."
},
"format": {
"enum": [
"markdown",
"html",
"json"
],
"type": "string",
"description": "Output format for each result's `text`. 'markdown' (default) is best for LLM consumption, 'html' returns cleaned semantic HTML, 'json' returns a structured document tree."
},
"purpose": {
"type": "string",
"maxLength": 2000,
"minLength": 1,
"description": "Optional short statement of the task these results are for — the goal behind the request, not the request itself. TinyFish uses it as an extra ranking signal. Example: 'Compare pricing tiers across vendors for a procurement report'. Max 2000 characters."
},
"image_links": {
"type": "boolean",
"description": "Include every <img src> on the page as absolute URLs in the result's `image_links` array. Defaults to false."
},
"if_none_match": {
"type": "string",
"minLength": 1,
"description": "An ETag saved from a prior fetch of this URL, forwarded verbatim as the If-None-Match request header. Single URL only. An unchanged page returns not_modified: true instead of a body."
},
"exclude_selectors": {
"type": "array",
"items": {
"type": "string",
"maxLength": 1000,
"minLength": 1
},
"maxItems": 20,
"minItems": 1,
"description": "1-20 CSS selectors for elements to remove BEFORE extraction, applied before include_selectors so it also prunes inside selected regions. Entries that match nothing are a no-op."
},
"if_modified_since": {
"type": "string",
"minLength": 1,
"description": "A Last-Modified value saved from a prior fetch of this URL, forwarded verbatim as the If-Modified-Since request header. Single URL only."
},
"include_selectors": {
"type": "array",
"items": {
"type": "string",
"maxLength": 1000,
"minLength": 1
},
"maxItems": 20,
"minItems": 1,
"description": "1-20 CSS selectors scoping extraction to elements matching ANY entry, concatenated in document order. Automatic boilerplate removal is bypassed. A partial miss still succeeds and reports unmatched_selectors; a total miss fails that URL with selector_not_matched plus candidate_selectors retry hints."
},
"per_url_timeout_ms": {
"type": "integer",
"maximum": 110000,
"minimum": 1,
"description": "Per-URL wall-clock budget in milliseconds (1-110000). A URL exceeding it returns a 'timeout' entry in errors[] while the rest of the batch still completes."
},
"include_etag_and_last_modified": {
"type": "boolean",
"description": "Return `etag` and `last_modified` on each result so they can be replayed as if_none_match / if_modified_since on a later call. Defaults to false. Fetch does not store them for you. Pair it with ttl=0: validators come from the origin, so a cached hit returns none."
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
Result schema
No fixed output contract is available. Field types reflect saved result evidence; individual responses can differ.
Provide body.urls with 1–10 HTTP(S) URLs. Optional format is markdown (default), html or json. The contract rejects private IPs, localhost and cloud-metadata addresses. The saved Example uses https://example.com with markdown.
Returns
The sample returns one page result with requested URL, final URL, title, text, format, language, latency_ms, author, description and published_date. It also retains the errors list.
Interpretation and limits
Page extraction reflects the fetched representation and can omit protected or unavailable material. An empty errors list describes this sample only. Null author, description and publication date are unavailable, not inferred from capture time.
Price and account
Verified on 2026-10-02: maximum reservation 0.000000 credits per execution; the saved successful call settled at 0.000000 credits. Toolmu uses one pay-per-use balance across available Tools, with no required subscription. Check current pricing before executing.
Source and freshness
Captured at 2026-10-02T02:51:09.767Z (UTC). This is a saved response for the recorded input, not a live result. Supplier observation dates can differ. Viewing this Example does not execute the Tool.
How do ttl and conditional-request validators affect freshness?
The contract defines omitted ttl as accepting any cached result, ttl 0 as a live fetch, and positive ttl as freshness in seconds. if_none_match or if_modified_since apply to a single URL; unchanged content can return not_modified. To obtain origin ETag/Last-Modified with include_etag_and_last_modified, use ttl 0. These options were not all exercised by the saved Example.
What happens if a URL times out or a CSS selector does not match?
The contract places individual URL failures in errors instead of failing the entire batch. per_url_timeout_ms is a per-URL limit of 1–110000 ms. Exclusions run before inclusions; a partial include-selector miss can succeed with unmatched selectors, while a total miss returns selector_not_matched and candidates. The one-URL Example does not test these failure cases.
The current Tool contract does not define an exhaustive output field list. The Example establishes the fields observed in its saved request; unobserved field availability and unresolved source meanings remain unverified.
Add 1 to 10 public web page links. The page text is returned in an easy-to-read layout automatically. Pages that require sign-in or block access may be incomplete.
Page extraction reflects the fetched representation and can omit protected or unavailable material. An empty errors list describes this sample only. Null author, description and publication date are unavailable, not inferred from capture time.
The sample returns one page result with requested URL, final URL, title, text, format, language, latency_ms, author, description and published_date. It also retains the errors list.
The contract defines omitted ttl as accepting any cached result, ttl 0 as a live fetch, and positive ttl as freshness in seconds. if_none_match or if_modified_since apply to a single URL; unchanged content can return not_modified. To obtain origin ETag/Last-Modified with include_etag_and_last_modified, use ttl 0. These options were not all exercised by the saved Example.
The contract places individual URL failures in errors instead of failing the entire batch. per_url_timeout_ms is a per-URL limit of 1–110000 ms. Exclusions run before inclusions; a partial include-selector miss can succeed with unmatched selectors, while a total miss returns selector_not_matched and candidates. The one-URL Example does not test these failure cases.
No. Viewing uses a saved response. Verified on 2026-10-02: maximum reservation 0.000000 credits per execution; the saved successful call settled at 0.000000 credits. Toolmu uses one pay-per-use balance across available Tools, with no required subscription. Check current pricing before executing.
Captured at 2026-10-02T02:51:09.767Z (UTC). This is a saved response for the recorded input, not a live result. Supplier observation dates can differ. Viewing this Example does not execute the Tool.