# PDF to text API in Node.js Extract the text of a PDF at a URL from Node.js or TypeScript with one fetch call: no pdf.js to bundle, the answer is JSON with one entry per page. ## Node.js example const API = "https://tools.funwords.eu/pdf/text"; async function pdfText(url, firstPage = 1, pages = 20) { const params = new URLSearchParams({ url, firstPage, pages }); const r = await fetch(`${API}?${params}`, { headers: { Authorization: `Bearer ${process.env.API_KEY}` }, }); if (!r.ok) throw new Error(await r.text()); return r.json(); } const doc = await pdfText("https://bitcoin.org/bitcoin.pdf"); console.log(doc.totalPages, "pages"); for (const page of doc.pages) console.log(page.page, page.text.slice(0, 200)); ## When an agent wants this - Read a PDF in a serverless function where a PDF library is too heavy - Loop over a long report 20 pages at a time - Hand page text to an LLM or an embedding step ## PDF to text, PDF text extraction: extract the text of a PDF document from a URL, page by page PDF to text, PDF text extraction: extract the text of a PDF document from a URL, page by page. $0.005 per successful call; failed calls are never charged. Extract the text of a public PDF (up to 10 MB) from its URL, page by page, with title, author and page count. Choose the first page, how many pages (up to 200) and maxChars. arXiv abstract links work. If a site blocks our fetch, the Internet Archive's dated copy is read and the answer says so. Scanned, encrypted and non-PDF files fail uncharged. Use to read papers, invoices, reports and manuals into an agent. Inputs: url (required): Absolute public http(s) URL of the PDF; firstPage: First page to read (default 1); pages: How many pages to read (1-200, default 20); maxChars: Maximum characters of text returned across all pages (1000-200000, default 50000). Not in the free calls over HTTP; pay from the first call. With prepaid credits this tool costs $0.002 a call: $1 by card pays for 500 calls, with no account and no subscription. With a card key from https://tools.funwords.eu/credits, in a header or, when your client can only fetch a URL, in the URL: curl -H "Authorization: Bearer adt_…" "https://tools.funwords.eu/pdf/text?url=https%3A%2F%2Fbitcoin.org%2Fbitcoin.pdf" curl "https://tools.funwords.eu/pdf/text?url=https%3A%2F%2Fbitcoin.org%2Fbitcoin.pdf&api_key=adt_…" Without a key the same URL answers 402 with x402 and MPP terms, so a wallet client pays USDC per call and retries. Over MCP (https://tools.funwords.eu/mcp) this tool is pdf_text. Example result: { "url": "https://bitcoin.org/bitcoin.pdf", "title": null, "author": null, "totalPages": 9, "firstPage": 1, "pagesRead": 1, "chars": 46, "truncated": true, "pages": [ { "page": 1, "chars": 46, "text": "Bitcoin: A Peer-to-Peer Electronic Cash System" } ] } Tool page: https://tools.funwords.eu/tools/pdf-text ## Questions **Does it run in a serverless or edge function?** Yes. It is one HTTPS request with fetch; nothing is installed and no file is held in memory on your side. **How do I read a whole long PDF?** Call it in steps: firstPage 1, 21, 41 and so on with pages 20, until firstPage passes totalPages. Up to 200 pages fit in one call. Docs for agents: https://tools.funwords.eu/llms.txt · OpenAPI: https://tools.funwords.eu/openapi.json · All guides: https://tools.funwords.eu/guides