reader README

The project's README from github.com/jina-ai/reader. As one markdown file: README.md.

Reader

codecov Ask DeepWiki

Your LLMs deserve better input.

Reader does two things:

Check out the live demo

Or just visit these URLs (Read) https://r.jina.ai/https://github.com/jina-ai/reader, (Search) https://s.jina.ai/Who%20will%20win%202024%20US%20presidential%20election%3F and see yourself.

Feel free to use Reader API in production. It is free, stable and scalable. We are maintaining it actively as one of the core products of Jina AI. Check out rate limit

image image

This repository is the open source branch of the codebase behind https://r.jina.ai and https://s.jina.ai. It runs in stateless or bucket-cached mode; the MongoDB-backed SaaS storage layer is not included here.

Updates

What Reader can read

Usage

Using r.jina.ai for single URL fetching

Simply prepend https://r.jina.ai/ to any URL. For example, to convert the URL https://en.wikipedia.org/wiki/Artificial_intelligence to an LLM-friendly input, use the following URL:

https://r.jina.ai/https://en.wikipedia.org/wiki/Artificial_intelligence

Using r.jina.ai for a full website fetching (Google Colab)

Simply prepend https://s.jina.ai/ to your search query. Note that if you are using this in the code, make sure to encode your search query first, e.g. if your query is Who will win 2024 US presidential election? then your url should look like:

https://s.jina.ai/Who%20will%20win%202024%20US%20presidential%20election%3F

Behind the scenes, Reader searches the web, fetches the top 5 results, visits each URL, and applies r.jina.ai to it. This is different from many web search function-calling in agent/RAG frameworks, which often return only the title, URL, and description provided by the search engine API. If you want to read one result more deeply, you have to fetch the content yourself from that URL. With Reader, http://s.jina.ai automatically fetches the content from the top 5 search result URLs for you (reusing the tech stack behind http://r.jina.ai). This means you don't have to handle browser rendering, blocking, or any issues related to JavaScript and CSS yourself.

Simply specify site in the query parameters such as:

curl 'https://s.jina.ai/When%20was%20Jina%20AI%20founded%3F?site=jina.ai&site=github.com'

Interactive Code Snippet Builder

We highly recommend using the code builder to explore different parameter combinations of the Reader API.

image

Using request headers

You can control the behavior of the Reader API using request headers. The list below covers the most useful ones — for the full surface with up-to-date defaults and validation rules, see the live API docs at https://r.jina.ai/docs, or the source of truth in src/dto/crawler-options.ts.

Using r.jina.ai for single page application (SPA) fetching

Many websites nowadays rely on JavaScript frameworks and client-side rendering, usually known as Single Page Applications (SPA). Thanks to Puppeteer and headless Chrome, Reader natively supports fetching these websites. However, due to specific approaches some SPAs are developed with, there may be some extra precautions to take.

SPAs with hash-based routing

By definition of the web standards, content after # in a URL is not sent to the server. To mitigate this, use POST with the url parameter in the body:

curl -X POST 'https://r.jina.ai/' -d 'url=https://example.com/#/route'

SPAs with preloading contents

Some SPAs (and even some non-SPAs) show preload content before later loading the main content dynamically. In this case, Reader may capture the preload content instead. Two ways to mitigate:

# wait for network idle or until timeout
curl 'https://r.jina.ai/https://example.com/' -H 'x-timeout: 10'

# wait for a specific element
curl 'https://r.jina.ai/https://example.com/' -H 'x-wait-for-selector: #content'

# combined use of both to wait for non-existent element (which means waiting for the full timeout duration)
curl 'https://r.jina.ai/https://example.com/' -H 'x-timeout: 30' -H 'x-wait-for-selector: non-existent-element'

JSON mode

Use the accept-header to control the output format:

curl -H "Accept: application/json" https://r.jina.ai/https://en.m.wikipedia.org/wiki/Main_Page

Generated alt

All images on a page that lack an alt tag can be auto-captioned by a VLM (vision-language model) and formatted as ![Image [idx]: [VLM_caption]](img_URL). This should give your downstream text-only LLM just enough hints to include those images in reasoning, selection, and summarization:

curl -H "X-With-Generated-Alt: true" https://r.jina.ai/https://en.m.wikipedia.org/wiki/Main_Page

Cookbooks

For pipeline-specific recipes — RAG, semantic indexing, deep research, agentic browsing, visual snapshots, PDF/Office/HTML uploads, and more — see cookbooks.md. Each entry is a short curl example with the header combination that fits the use case and a paragraph explaining the trade-offs.

Self-host with Docker

A prebuilt image of the open-source branch is published to GitHub Container Registry. It bundles headless Chrome, LibreOffice, and CJK fonts, so you can run Reader without building it yourself.

docker pull ghcr.io/jina-ai/reader:oss

Run

The image exposes two ports:

For a quick try-out from curl or a browser, map the HTTP/1.1 port:

docker run --rm -p 3000:8081 ghcr.io/jina-ai/reader:oss
# then: curl http://localhost:3000/https://example.com

For load-testing or production-shape traffic, map the h2c port instead (or both):

docker run --rm -p 3000:8080 -p 3001:8081 ghcr.io/jina-ai/reader:oss

With no extra config the container is fully stateless — every request hits the live URL, no cache, no rate limiting. That's the right default for a quick try-out, CI, or throwaway environments.

Run with caching

Point Reader at an S3-compatible bucket to cache fetched pages and reuse them across requests:

docker run --rm -p 3000:8081 \
  -e GCP_STORAGE_ENDPOINT=https://s3.example.com \
  -e GCP_STORAGE_BUCKET=reader-cache \
  -e GCP_STORAGE_ACCESS_KEY=... \
  -e GCP_STORAGE_SECRET_KEY=... \
  ghcr.io/jina-ai/reader:oss

See CONTRIBUTING.md for the full env-var table.

Local development

Requirements:

git clone [email protected]:jina-ai/reader.git
cd reader
npm install
# Optional, for bucket-cached mode:
docker compose up -d

Then either press F5 in VSCode to launch the debugger, or after setting up the appropriate environment variables:

npm run dev

For a deeper tour of the codebase — engines, formatting profiles, abuse alleviation, deployment topology — see architecture.md. For dev workflow, env vars, and tests, see CONTRIBUTING.md.

Licensed assets

A few non-redistributable artifacts live in licensed/ and are needed at build/runtime:

Fetch them in one shot:

npm run assets:download

The script (download-external-assets.sh) is idempotent — it skips files already present and exits 0 even on partial network failure. Set FORCE_DOWNLOAD_EXTERNAL=1 to overwrite, or SKIP_DOWNLOAD_EXTERNAL=1 to bypass entirely if you supply your own copies. The repo's CI fetches the same URLs inline; this script exists for local convenience.

How it works

Ask DeepWiki

Having trouble on some websites?

Some sites push back against scrapers — bot challenges, geo blocks, stale CDN edges. A few knobs to try, in roughly increasing order of "this is bothering me":

If none of those help, please open an issue with the URL and the headers you tried — we'll take a look.

License

Reader is backed by Jina AI and licensed under Apache-2.0.

reader (jina-ai/reader)

Searching Database…

12.2K ·GitHub
Что это такое?Reader — это сервис, который превращает любой URL в аккуратный markdown, удобный для LLM, достаточно добавить перед ним https://r.jina.ai/. Также есть точка доступа для веб-поиска по адресу https://s.jina.ai/, которая возвращает читаемое содержимое для топ-результатов поиска, а не только заголовки и сниппеты.
Это размещённый API или мне нужно запускать собственный сервер?Можно сразу пользоваться бесплатным размещённым API, добавляя префикс к URL, или развернуть открытую ветку самостоятельно с готовым образом Docker.
Как этим пользоваться на практике?Просто добавьте https://r.jina.ai/ перед любым URL, чтобы получить его версию в markdown, или добавьте https://s.jina.ai/ перед поисковым запросом в URL-кодировке, чтобы получить результаты поиска, загруженные и преобразованные в markdown.
Нужен ли мне API-ключ для использования?Нет, базовое использование бесплатное и не требует ключа, но анонимный трафик получает ограничение частоты запросов с самым низким уровнем доверия; получение API-ключа открывает более высокие квоты и дополнительные функции, например пул прокси.
Работает ли это без проблем на каждом сайте?Не всегда: некоторые сайты отвечают проверками на бота, геоблокировками или устаревшим кэшем CDN, поэтому у Reader есть настройки вроде обхода кэша, принудительного использования браузерного движка или маршрутизации через прокси, чтобы всё же получить доступ.
Могу ли я развернуть это у себя, а не полагаться на публичный API?Да, образ Docker включает headless Chrome, LibreOffice и шрифты CJK, поэтому работает автономно; по умолчанию он не хранит состояние, а кэширование в корзины S3/MinIO можно включить опционально через docker compose.
Какие типы файлов, кроме веб-страниц, может читать Reader?Он читает PDF через PDF.js, документы MS Office (Word, Excel, PowerPoint), которые конвертируются через LibreOffice, и изображения, к которым визуально-языковая модель добавляет подписи, чтобы текстовые LLM могли с ними работать.
Чем поиск Reader отличается от обычных поисковых API?Вместо того чтобы возвращать только заголовок, URL и сниппет, как большинство поисковых API, s.jina.ai автоматически загружает первые 5 страниц результатов и преобразует их в полный markdown.
Можно ли контролировать формат вывода и разбиение на фрагменты?Да, можно запросить вывод в markdown, JSON или семантически разбитый на фрагменты (по заголовкам или структурным уровням) через заголовки вроде x-markdown-chunking, а также тонко настроить отображение ссылок и изображений.
Почему в открытой версии нет слоя хранения SaaS?Ветка oss убирает хранилище на MongoDB, которое использует размещённая версия Jina SaaS, и по умолчанию работает без состояния; для тех, кто разворачивает сам и хочет кэширование без полного бэкенда SaaS, есть необязательное кэширование в корзины S3/MinIO.
Creator
jina-ai
Size
1.5 MB
Stars
12.2K
Updated
CommitMay 22
Age
2y
Commits · 90 Days