# Riferimento dell'endpoint read: GET e POST /read

> Riferimento dell'endpoint read: ogni parametro di GET e POST /read, da format e render a country e max_chars, con esempi. Da 0,07 USD/1K pagine, senza KYC.

- URL: https://webreaderapi.com/it/docs/read/
- Ultimo aggiornamento: 2026-10-22
- Editore: WebReaderAPI (https://webreaderapi.com)

`/read` recupera una pagina pubblica, ne estrae il contenuto principale e lo restituisce come Markdown, testo semplice o HTML pulito. Questa pagina elenca ogni parametro, il suo default e quanto costa.

**Risposta rapida — Quali parametri accetta l'endpoint read di WebReaderAPI?**

L'endpoint `/read` di **WebReaderAPI** richiede un parametro, `url`. Quelli opzionali scelgono l'output (`format`), quanto della pagina mantenere (`main_content`), se eseguire un browser (`render`), link e immagini, il paese di lettura, un limite di caratteri e un timeout. Una pagina semplice costa 1 credito, 2 con un browser, da 0,07 USD/1K pagine a ottobre 2026. Senza KYC; paghi in criptovalute.

## /read at a glance

| Attributo | Valore |
| --- | --- |
| Metodi | `GET` con parametri di query, o `POST` con un body JSON che usa gli stessi nomi |
| URL | `https://webreaderapi.com/api/v1/read` |
| Obbligatorio | `url`: un indirizzo http o https, fino a 2.048 caratteri |
| Output predefinito | Markdown del contenuto principale |
| Fatturazione | 1 credito = 1 pagina letta senza browser; 2 crediti quando la pagina richiede un browser per eseguire JavaScript. Una richiesta che fallisce, o che il robots.txt di un sito rifiuta, non viene addebitata |
| Paese | Scegliere il paese da cui leggere una pagina aggiunge 10 crediti, perché la pagina viene poi letta tramite una connessione residenziale in quel paese |
| PDF | I file PDF fino a 20 MB e 100 pagine vengono convertiti in Markdown, a 1 credito per ogni blocco di 10 pagine iniziato |
| Identità del crawler | `WebReaderAPI/1.0 (+https://webreaderapi.com/bot/)` |

## Leggi una pagina (GET)

`GET /api/v1/read`

Recupera una pagina pubblica e restituisce il suo contenuto principale come Markdown, con i metadata della pagina. I parametri vanno nella query string, codificati come URL. L'esempio legge un post di un blog; ID, date e valori sono illustrativi.

Autenticazione: chiave API nell'header `Authorization: Bearer API_KEY`.

**Parametri**

| Nome | In | Tipo | Obbligatorio | Descrizione |
| --- | --- | --- | --- | --- |
| `url` | query | string | Sì | La pagina da leggere: http o https, al massimo 2.048 caratteri. Gli indirizzi privati, locali e di metadata cloud vengono rifiutati. |
| `format` | query | string | No | `markdown` (default), `text` (testo semplice, senza markup) o `html` (HTML pulito del contenuto). |
| `main_content` | query | boolean | No | `true` (default) mantiene solo l'articolo o il contenuto principale; `false` converte l'intera pagina, menu e footer inclusi. |
| `render` | query | string | No | `auto` (default) avvia un browser solo quando l'HTML grezzo contiene troppo poco testo; `true` sempre; `false` mai. Una pagina renderizzata costa 2 crediti. |
| `include_links` | query | boolean | No | `true` aggiunge un elenco `links` di `{url, text}`. Default `false`. |
| `include_images` | query | boolean | No | `true` mantiene le immagini come `![alt](src)` nel Markdown. Default `false`. |
| `country` | query | string | No | Codice paese di due lettere (ISO 3166-1 alpha-2). La pagina viene letta da un indirizzo in quel paese, per 10 crediti extra (connessione residenziale). |
| `max_chars` | query | integer | No | Taglia l'output a questo numero di caratteri, da 1.000 a 500.000. Utile per rientrare nel contesto di un modello. |
| `timeout` | query | integer | No | Secondi di attesa per il sito, da 5 a 60. Predefinito 30. |
| `api_key` | query | string | No | La tua chiave, se non invii l'header `Authorization`. |

**Risposta** `200`

```json
{
  "url": "https://example.com/blog/first-post",
  "final_url": "https://example.com/blog/first-post",
  "status_code": 200,
  "fetched_at": "2026-10-22T09:41:12Z",
  "rendered": false,
  "credits_used": 1,
  "title": "Our first post",
  "description": "Why we started this blog and what comes next.",
  "language": "en",
  "author": "Jane Doe",
  "published_at": "2026-10-01",
  "site_name": "Example Blog",
  "markdown": "# Our first post\n\nWe started this blog to share what we learn...\n\n## What comes next\n\n- A post every month\n- Notes from our team",
  "word_count": 612
}
```

*curl*

```bash
curl -sG "https://webreaderapi.com/api/v1/read" \
  -H "Authorization: Bearer $WEBREADER_API_KEY" \
  --data-urlencode "url=https://example.com/blog/first-post" \
  -d format=markdown -d max_chars=20000
```

*Python*

```python
import os
import requests

resp = requests.get(
    "https://webreaderapi.com/api/v1/read",
    headers={"Authorization": "Bearer " + os.environ["WEBREADER_API_KEY"]},
    params={"url": "https://example.com/blog/first-post", "max_chars": 20000},
    timeout=70,
)
resp.raise_for_status()
print(resp.json()["markdown"][:300])
```

*Node.js*

```javascript
const params = new URLSearchParams({ url: 'https://example.com/blog/first-post', max_chars: '20000' });
const res = await fetch(`https://webreaderapi.com/api/v1/read?${params}`, {
  headers: { Authorization: `Bearer ${process.env.WEBREADER_API_KEY}` },
});
const page = await res.json();
console.log(page.markdown.slice(0, 300));
```

## Leggi una pagina (POST)

`POST /api/v1/read`

Stesso endpoint, stessi parametri, inviati come corpo JSON. Preferisci POST quando l'URL è molto lungo o quando il tuo client HTTP costruisce JSON più facilmente delle query string. La risposta è identica a quella della forma GET.

Autenticazione: chiave API nell'header `Authorization: Bearer API_KEY`.

**Corpo della richiesta**

| Campo | Tipo | Obbligatorio | Descrizione |
| --- | --- | --- | --- |
| `url` | string | Sì | La pagina da leggere. |
| `format`, `main_content`, `render`, `include_links`, `include_images`, `country`, `max_chars`, `timeout` | mixed | No | Come nella tabella GET qui sopra, con i tipi JSON: booleani come `true`/`false`, numeri senza virgolette. |

*Esempio: a JavaScript-heavy page, read from Germany, with its links*

```json
{
  "url": "https://example.com/app/pricing",
  "render": "true",
  "country": "de",
  "include_links": true,
  "max_chars": 30000
}
```

**Risposta** `200`

```json
{
  "url": "https://example.com/app/pricing",
  "final_url": "https://example.com/de/app/pricing",
  "status_code": 200,
  "fetched_at": "2026-10-22T09:44:03Z",
  "rendered": true,
  "credits_used": 3,
  "title": "Pricing",
  "language": "de",
  "markdown": "# Pricing\n\n| Plan | Price |\n|---|---|\n| Basic | ... |",
  "word_count": 214,
  "links": [
    {
      "url": "https://example.com/de/contact",
      "text": "Contact"
    }
  ]
}
```

*curl*

```bash
curl -s "https://webreaderapi.com/api/v1/read" \
  -H "Authorization: Bearer $WEBREADER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://example.com/app/pricing", "render": "true", "country": "de", "include_links": true}'
```

*Python*

```python
import os
import requests

resp = requests.post(
    "https://webreaderapi.com/api/v1/read",
    headers={"Authorization": "Bearer " + os.environ["WEBREADER_API_KEY"]},
    json={"url": "https://example.com/app/pricing", "render": "true", "country": "de", "include_links": True},
    timeout=70,
)
print(resp.json()["credits_used"], "credits")
```

*Node.js*

```javascript
const res = await fetch('https://webreaderapi.com/api/v1/read', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.WEBREADER_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ url: 'https://example.com/app/pricing', render: 'true', country: 'de', include_links: true }),
});
console.log((await res.json()).credits_used);
```

## Quale formato di output devo scegliere?

Scegli `markdown` per i modelli linguistici e RAG: titoli, elenchi, tabelle e link sopravvivono, e il testo resta compatto. Scegli `text` quando devi solo contare parole, classificare o cercare, e il markup sarebbe rumore. Scegli `html` quando la tua pipeline già analizza HTML e vuoi solo togliere il superfluo.

I campi dei metadati sono gli stessi in tutti e tre i formati. Cambia solo il nome del campo del contenuto: `markdown`, `text` o `html`.

## Quando devo impostare main_content su false?

Impostalo su `false` quando le parti intorno all'articolo sono ciò che ti serve. Esempi sono la navigazione di un sito per mapparne le sezioni, un footer con dettagli legali o di contatto, o una pagina prodotto le cui specifiche stanno in una sidebar.

Con il valore predefinito `true`, l'estrattore mantiene il blocco del contenuto principale e scarta navigazione, banner cookie, annunci, pulsanti di condivisione e footer. È ciò che la maggior parte degli agenti e delle pipeline RAG vuole, e spesso riduce una pagina a una frazione della sua dimensione HTML.

## Come fa render=auto a decidere di usare un browser?

Prima recupera l'HTML grezzo, che è veloce e costa 1 credito. Se quell'HTML contiene troppo poco testo leggibile, tipicamente un'app che costruisce la pagina con JavaScript, ricarica la pagina in un browser headless e la chiamata costa 2 crediti. La risposta ti dice quale percorso è stato eseguito: `rendered` è `true` o `false`.

Imposta `render=false` quando sai che il sito serve HTML completo e vuoi un costo fisso. Imposta `render=true` per le single-page app, per saltare il primo tentativo.

## Cosa cambiano country e max_chars?

`country` legge la pagina da un indirizzo nel paese che indichi, con lo stesso User-Agent. Usalo per pagine i cui prezzi, lingua o disponibilità cambiano in base al paese. Aggiunge 10 crediti, perché la pagina viene poi letta tramite una connessione residenziale, e non può essere usato con i paesi in cui il servizio non opera.

`max_chars` taglia l'output dopo quel numero di caratteri. Non cambia il prezzo, ma protegge la context window di un agente: 20.000 caratteri è un valore predefinito sensato per una singola pagina passata a un modello.

## /read può gestire i file PDF?

Sì. Quando l'URL restituisce un PDF, il testo torna come Markdown nello stesso campo `markdown`. I file PDF fino a 20 MB e 100 pagine vengono convertiti in Markdown, a 1 credito per ogni blocco di 10 pagine iniziato. I PDF scansionati senza livello di testo restituiscono poco o nessun testo, perché non c'è una fase di riconoscimento dei caratteri.

## Endpoint Read: domande comuni

### /read segue i redirect?

Sì, fino a 5. La risposta fornisce l'indirizzo che hai richiesto in `url` e l'indirizzo effettivamente letto in `final_url`. Un redirect verso un indirizzo privato o locale viene rifiutato.

### Posso leggere una pagina che richiede un login?

No. Se un sito rifiuta la nostra richiesta, restituiamo la sua risposta: non risolviamo mai CAPTCHA, non accediamo agli account e non tentiamo di aggirare un blocco o un paywall. Le pagine dietro un login o un paywall restituiscono il rifiuto del sito, e la chiamata è gratuita.

### Il controllo di robots.txt viene fatto a ogni chiamata?

Sì, su una copia del robots.txt del sito che ha al massimo 24 ore. Un URL non consentito restituisce `403 blocked_by_robots` e non usa crediti.

### Quante pagine posso leggere contemporaneamente?

Ogni account ha un limite di pagine lette contemporaneamente; la tua dashboard lo mostra e il supporto può aumentarlo. Per molti URL, un [job batch](https://webreaderapi.com/it/docs/crawl/) è più semplice di molte chiamate parallele.

---

WebReaderAPI: WebReaderAPI è un'API web reader per agenti AI che converte qualsiasi pagina web pubblica in Markdown pulito, con pagamento in criptovalute e senza caricare documenti d'identità. I crediti prepagati da 0,07 USD/1K pagine non scadono mai e robots.txt viene rispettato. Senza KYC — niente documento, niente selfie, niente documenti. Paga in criptovalute.
