---
name: "web_read"
area: "web"
title: "Read a web page"
price: "$0.002"
method: "POST"
url: "https://api.conecto.chat/v1/tools/web_read"
mcp_server: "https://api.conecto.chat/mcp/web"
auth: "Authorization: Bearer <conecto_sk_ key>"
docs_url: "https://conecto.chat/tools/web/web_read"
---

# Read a web page (`web_read`)

Reads one public page and returns its main content as clean Markdown with its title, description and links; a PDF comes back as its text.

Fetch one public page and get its main content as clean Markdown (menus, ads and footers left out), with its title, description and the links on it. PDFs come back as their text. Pages that need JavaScript to show anything, need a login, or whose robots.txt closes them to bots can't be read, and cost nothing.

Price: $0.002 a call. A call that fails costs nothing.

## Use it when

A page's words are needed: a supplier's terms, a competitor's prices, an article.

- For finding pages first, use [web_search](https://conecto.chat/tools/web/web_search.md).
- For keeping the file itself, use [files_upload](https://conecto.chat/tools/files/files_upload.md).

## Say this to your agent

> Read Cascade Bike Supply's shipping terms page and tell me what they charge for orders under $500.

## Inputs

| Name | Type | Required | Description | Allowed values | Default |
|---|---|---|---|---|---|
| `url` | string | yes | 4 to 2,000 characters. |  |  |
| `links` | boolean | no | Include the links on the page. |  | `true` |
| `max_characters` | integer | no | 1,000 to 100,000. |  | `20000` |

## Example

Written for Halverson Cycle & Repair, a bike shop with a repair workshop in Portland, Oregon.

MCP: call `web_read` on the MCP server `https://api.conecto.chat/mcp/web` with these arguments:

```json
{
  "url": "https://www.cascadebikesupply.example/shipping-terms",
  "links": false
}
```

REST:

```bash
curl https://api.conecto.chat/v1/tools/web_read \
  -H "Authorization: Bearer $CONECTO_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://www.cascadebikesupply.example/shipping-terms", "links": false}'
```

## Response

```json
{
  "call_id": "5f0c8a2e-3b7d-4c1e-9a64-2d8e1f7b0c93",
  "tool": "web_read",
  "status": "succeeded",
  "replayed": false,
  "cost_usd": "$0.002",
  "balance_usd": "$19.75",
  "result": {
    "url": "https://www.cascadebikesupply.example/shipping-terms",
    "kind": "page",
    "title": "Shipping terms",
    "description": "How and when we ship parts to bike shops.",
    "site": "cascadebikesupply.example",
    "published": null,
    "language": "en",
    "characters": 259,
    "truncated": false,
    "content": "# Shipping terms\n\nWe ship parts from our warehouse in Tacoma within one working day of your order.\n\nOrders under $500 pay a flat $19 for shipping in Oregon and Washington. From $500, shipping is free.\n\n## Returns\n\nShops can return unused parts within 30 days."
  }
}
```

`result`: url, kind (page, pdf or text), title, description, site, published, language, links, characters, truncated, and the content in Markdown.

## Errors

| Code | Status | When | Fix |
|---|---|---|---|
| `invalid_url` | 400 | The address is not a public web address. | Send one like https://example.com/page. |
| `blocked_by_robots` | 403 | The site's robots.txt asks bots not to read the page. | Find the facts elsewhere with web_search. |
| `not_found` | 404 | The page does not exist. | Check the address, or find the page with web_search. |
| `too_large` | 413 | The page is over 5 MB. | Read a smaller page, or keep the file with files_upload. |
| `fetch_failed` | 422 | The site could not be reached, redirected too often, or answered with an error. | Check the address, or try again later. |
| `refused` | 422 | The site refused to show the page to a bot. | Find the facts elsewhere with web_search. |
| `empty` | 422 | The page has no readable text; it may need JavaScript to show anything. | Find the facts elsewhere with web_search. |
| `not_a_page` | 422 | The address is a file, not a page. | Keep it with files_upload and its url. |
| `invalid_pdf` | 422 | The PDF could not be read. | Keep it with files_upload, then read it there. |
| `pdf_locked` | 422 | The PDF is password-protected. | Ask for a copy without a password. |
| `busy` | 503 | PDFs are being read for other calls right now. | Try again in a minute. |
| `timeout` | 504 | The site took too long to send the page. | Try again later. |

The refusals every tool can give (401 key, 402 balance, 429 limits) are on the errors page: https://conecto.chat/docs/errors.md

## Related

- [web_search](https://conecto.chat/tools/web/web_search.md): Searches the web through Conecto's own search service and returns each result's title, link, site and snippet. $0.009 a call.
