# Referensi endpoint read: GET dan POST /read

> Referensi endpoint dari US$0,07/1K halaman: parameter GET dan POST /read, dari format dan render hingga country dan max_chars, dengan contoh.

- URL: https://webreaderapi.com/id/docs/read/
- Terakhir diperbarui: 2026-10-22
- Penerbit: WebReaderAPI (https://webreaderapi.com)

`/read` mengambil satu halaman publik, mengekstrak konten utamanya dan mengembalikannya sebagai Markdown, teks biasa atau HTML yang sudah dibersihkan. Halaman ini mencantumkan setiap parameter, nilai default dan biayanya.

**Jawaban singkat — Parameter apa saja yang diterima endpoint read WebReaderAPI?**

Endpoint `/read` **WebReaderAPI** membutuhkan satu parameter, `url`. Parameter opsional memilih output (`format`), berapa banyak halaman yang disimpan (`main_content`), apakah browser dijalankan (`render`), tautan dan gambar, negara pembacaan, batas karakter dan timeout. Halaman biasa berbiaya 1 kredit, 2 dengan browser, mulai US$0,07/1K halaman per Oktober 2026. Tanpa KYC; bayar dengan kripto.

## /read at a glance

| Atribut | Nilai |
| --- | --- |
| Metode | `GET` dengan parameter kueri, atau `POST` dengan body JSON menggunakan nama yang sama |
| URL | `https://webreaderapi.com/api/v1/read` |
| Wajib | `url`: alamat http atau https, hingga 2.048 karakter |
| Output default | Markdown konten utama |
| Penagihan | 1 kredit = 1 halaman dibaca tanpa browser; 2 kredit jika halaman memerlukan browser untuk merender JavaScript. Permintaan yang gagal, atau yang ditolak oleh robots.txt suatu situs, tidak dikenai biaya |
| Negara | Memilih negara asal pembacaan halaman menambah 10 kredit, karena halaman kemudian dibaca melalui koneksi residensial di negara tersebut |
| PDF | File PDF hingga 20 MB dan 100 halaman dikonversi menjadi Markdown, dengan 1 kredit per blok 10 halaman yang dimulai |
| Identitas crawler | `WebReaderAPI/1.0 (+https://webreaderapi.com/bot/)` |

## Baca satu halaman (GET)

`GET /api/v1/read`

Mengambil satu halaman publik dan mengembalikan konten utamanya sebagai Markdown, beserta metadata halaman. Parameter diletakkan di query string, di-URL-encode. Contoh membaca sebuah pos blog; ID, tanggal dan nilai bersifat ilustratif.

Autentikasi: API key di header `Authorization: Bearer API_KEY`.

**Parameter**

| Nama | Di | Tipe | Wajib | Deskripsi |
| --- | --- | --- | --- | --- |
| `url` | query | string | Ya | Halaman yang akan dibaca: http atau https, maksimal 2.048 karakter. Alamat privat, lokal dan cloud metadata ditolak. |
| `format` | query | string | Tidak | `markdown` (default), `text` (teks biasa, tanpa markup) atau `html` (HTML konten yang sudah dibersihkan). |
| `main_content` | query | boolean | Tidak | `true` (default) hanya menyimpan artikel atau konten utama; `false` mengubah seluruh halaman, termasuk menu dan footer. |
| `render` | query | string | Tidak | `auto` (default) hanya menjalankan browser saat HTML mentah berisi terlalu sedikit teks; `true` selalu; `false` tidak pernah. Halaman yang dirender berbiaya 2 kredit. |
| `include_links` | query | boolean | Tidak | `true` menambahkan daftar `{url, text}` berupa `links`. Default `false`. |
| `include_images` | query | boolean | Tidak | `true` menyimpan gambar sebagai `![alt](src)` di Markdown. Default `false`. |
| `country` | query | string | Tidak | Kode negara dua huruf (ISO 3166-1 alpha-2). Halaman dibaca dari alamat di negara tersebut, dengan biaya 10 kredit tambahan (koneksi residential). |
| `max_chars` | query | integer | Tidak | Memotong output pada jumlah karakter ini, dari 1.000 hingga 500.000. Berguna agar muat dalam konteks model. |
| `timeout` | query | integer | Tidak | Waktu tunggu untuk situs, dari 5 hingga 60 detik. Default 30. |
| `api_key` | query | string | Tidak | API key Anda, jika Anda tidak mengirim header `Authorization`. |

**Response** `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));
```

## Membaca satu halaman (POST)

`POST /api/v1/read`

Endpoint yang sama, parameter yang sama, dikirim sebagai body JSON. Gunakan POST jika URL sangat panjang atau jika klien HTTP Anda lebih mudah membangun JSON daripada query string. Responsnya identik dengan bentuk GET.

Autentikasi: API key di header `Authorization: Bearer API_KEY`.

**Request body**

| Field | Tipe | Wajib | Deskripsi |
| --- | --- | --- | --- |
| `url` | string | Ya | Halaman yang akan dibaca. |
| `format`, `main_content`, `render`, `include_links`, `include_images`, `country`, `max_chars`, `timeout` | mixed | Tidak | Seperti pada tabel GET di atas, dengan tipe JSON: boolean sebagai `true`/`false`, angka tanpa tanda kutip. |

*Contoh: 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
}
```

**Response** `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);
```

## Format output mana yang harus saya pilih?

Pilih `markdown` untuk model bahasa dan RAG: heading, list, tabel, dan tautan tetap terjaga, dan teksnya tetap ringkas. Pilih `text` jika Anda hanya menghitung kata, mengklasifikasi, atau mencari, dan markup hanya akan jadi noise. Pilih `html` jika pipeline Anda sendiri sudah mem-parse HTML dan Anda hanya ingin elemen pengganggunya hilang.

Field metadata sama di ketiga format. Hanya nama field konten yang berubah: `markdown`, `text`, atau `html`.

## Kapan saya harus mengatur main_content ke false?

Atur ke `false` jika bagian di sekitar artikel justru yang Anda butuhkan. Contohnya navigasi situs untuk memetakan bagian-bagiannya, footer berisi detail hukum atau kontak, atau halaman produk yang spesifikasinya ada di sidebar.

Dengan default `true`, ekstraktor mempertahankan blok konten utama dan membuang navigasi, banner cookie, iklan, tombol share, dan footer. Itulah yang diinginkan sebagian besar agent dan pipeline RAG, dan sering kali memangkas halaman menjadi sebagian kecil dari ukuran HTML-nya.

## Bagaimana render=auto memutuskan untuk memakai browser?

Pertama, ia mengambil HTML mentah, yang cepat dan memakan 1 kredit. Jika HTML tersebut berisi terlalu sedikit teks yang bisa dibaca, biasanya aplikasi yang membangun halaman dengan JavaScript, ia memuat halaman lagi di browser headless dan panggilan tersebut memakan 2 kredit. Respons memberi tahu Anda jalur mana yang berjalan: `rendered` bernilai `true` atau `false`.

Atur `render=false` jika Anda tahu situs menyajikan HTML lengkap dan ingin biaya tetap. Atur `render=true` untuk single-page app, agar melewati percobaan pertama.

## Apa yang diubah oleh country dan max_chars?

`country` membaca halaman dari alamat di negara yang Anda tentukan, dengan User-Agent yang sama. Gunakan untuk halaman yang harga, bahasa, atau ketersediaannya berubah menurut negara. Ini menambah 10 kredit, karena halaman kemudian dibaca melalui koneksi residensial, dan tidak dapat digunakan untuk negara tempat layanan tidak beroperasi.

`max_chars` memotong output setelah sejumlah karakter tersebut. Ini tidak mengubah harga, tetapi melindungi context window milik agent: 20.000 karakter adalah default yang masuk akal untuk satu halaman yang diteruskan ke model.

## Apakah /read dapat menangani file PDF?

Ya. Saat URL mengembalikan PDF, teksnya dikembalikan sebagai Markdown dalam field `markdown` yang sama. File PDF hingga 20 MB dan 100 halaman dikonversi menjadi Markdown, dengan 1 kredit per blok 10 halaman yang dimulai. PDF hasil pindai tanpa lapisan teks mengembalikan sedikit atau tidak ada teks, karena tidak ada langkah pengenalan karakter.

## Endpoint read: pertanyaan umum

### Apakah /read mengikuti redirect?

Ya, hingga 5 kali. Respons memberikan alamat yang Anda minta di `url` dan alamat yang benar-benar dibaca di `final_url`. Redirect ke alamat privat atau lokal akan ditolak.

### Bisakah saya membaca halaman yang memerlukan login?

Tidak. Jika suatu situs menolak permintaan kami, kami mengembalikan jawabannya: kami tidak pernah menyelesaikan CAPTCHA, masuk ke akun, atau mencoba mengatasi blokir atau paywall. Halaman di balik login atau paywall mengembalikan penolakan dari situs, dan panggilannya gratis.

### Apakah pengecekan robots.txt dilakukan pada setiap panggilan?

Ya, terhadap salinan robots.txt situs yang berumur paling lama 24 jam. URL yang dilarang mengembalikan `403 blocked_by_robots` dan tidak memakai kredit.

### Berapa banyak halaman yang dapat saya baca secara bersamaan?

Setiap akun memiliki batas berapa banyak halaman yang dibaca sekaligus; dashboard Anda menampilkannya, dan support dapat menaikkannya. Untuk banyak URL, [batch job](https://webreaderapi.com/id/docs/crawl/) lebih sederhana daripada menjalankan banyak panggilan paralel.

---

WebReaderAPI: WebReaderAPI adalah API pembaca web untuk AI agent yang mengubah halaman web publik apa pun menjadi Markdown bersih, dibayar dengan kripto tanpa unggah identitas. Kredit prabayar mulai dari US$0,07/1K halaman tidak pernah kedaluwarsa, dan robots.txt dihormati. Tanpa KYC — tanpa identitas, tanpa selfie, tanpa dokumen. Bayar dengan kripto.
