Je eerste verzoek in Node.js
- Ontvang een gratis API-sleutelRegistreer je en kopieer deze vanuit je dashboard.
- Sla deze op in een omgevingsvariabele
PDF_SUMMARIZE_KEY. - Bouw een FormDataVoeg de PDF toe als een Blob onder het veld
file. - Verstuur via POST en lees de JSON.
// summarize.mjs — node summarize.mjs report.pdf
import { readFile } from 'node:fs/promises';
import { basename } from 'node:path';
const API_URL = 'https://pdf-summarize.com/api/summarize.php';
const KEY = process.env.PDF_SUMMARIZE_KEY;
export async function summarizePdf(path, { length = 'medium', format = 'bullets', outputLang = 'auto' } = {}) {
const form = new FormData();
form.append('file', new Blob([await readFile(path)], { type: 'application/pdf' }), basename(path));
form.append('length', length);
form.append('format', format);
form.append('outputLang', outputLang);
const res = await fetch(API_URL, {
method: 'POST',
headers: { Authorization: `Bearer ${KEY}` },
body: form,
signal: AbortSignal.timeout(180_000),
});
const data = await res.json();
if (!res.ok || !data.success) throw new Error(`${res.status}: ${data.error ?? JSON.stringify(data)}`);
return data;
}
const result = await summarizePdf(process.argv[2]);
console.log(result.summary);
console.log(`${result.page_count} pagina's, ${result.processing_time}s, nog ${result.requests_remaining} verzoeken over`);
De samenvatting streamen
export async function streamSummary(path, onText) {
const form = new FormData();
form.append('file', new Blob([await readFile(path)], { type: 'application/pdf' }), basename(path));
form.append('length', 'long');
const res = await fetch(API_URL + '?stream=1', { method: 'POST', headers: { Authorization: `Bearer ${KEY}` }, body: form });
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const decoder = new TextDecoder();
let buffer = '';
for await (const chunk of res.body) {
buffer += decoder.decode(chunk, { stream: true });
const lines = buffer.split('\n');
buffer = lines.pop();
for (const line of lines) {
if (!line.startsWith('data: ')) continue;
const payload = line.slice(6);
if (payload === '[DONE]') return;
const event = JSON.parse(payload);
if (event.error) throw new Error(event.error);
if (event.type === 'summary') onText(event.content);
}
}
}
await streamSummary('paper.pdf', (t) => process.stdout.write(t));
Een Express-endpoint voor je eigen app
Je frontend uploadt naar jouw server, die de sleutel toevoegt en het bestand doorstuurt:
import express from 'express';
import multer from 'multer';
const app = express();
const upload = multer({ limits: { fileSize: 20 * 1024 * 1024 } });
app.post('/summarize', upload.single('file'), async (req, res) => {
if (!req.file) return res.status(400).json({ error: 'Geen bestand' });
const form = new FormData();
form.append('file', new Blob([req.file.buffer], { type: 'application/pdf' }), req.file.originalname);
form.append('length', req.body.length ?? 'medium');
const r = await fetch('https://pdf-summarize.com/api/summarize.php', {
method: 'POST', headers: { Authorization: `Bearer ${process.env.PDF_SUMMARIZE_KEY}` }, body: form,
});
res.status(r.status).json(await r.json());
});
app.listen(3000);
Foutafhandeling
| Status | Betekenis |
|---|---|
| 400 | Ontbrekend bestand, geen PDF of paginalimiet overschreden |
| 401 | Ontbrekende of ongeldige sleutel |
| 413 | Bestand is te groot |
| 422 | Geen leesbare tekst in de PDF |
| 429 | Limiet of quotum bereikt — probeer het later opnieuw met backoff |
| 500 | Tijdelijke fout bij het samenvatten — probeer opnieuw |
Veelgestelde vragen
Kan ik de API rechtstreeks vanuit de browser aanroepen?
Technisch gezien wel, maar je sleutel is dan zichtbaar voor iedereen. Proxy verzoeken via je backend zoals in het Express-voorbeeld.
Werkt dit met Deno, Bun of Cloudflare Workers?
Ja — elke runtime met standaard fetch en FormData werkt op dezelfde manier.
Is er een TypeScript SDK?
Nog niet. De API is een enkel multipart-endpoint, dus een kleine getypte wrapper rond fetch is voldoende.
Waar vind ik de volledige naslagwerken?
In de API-documentatie, met alle parameters en voorbeelden in verschillende talen.