Votre premier appel dans Node.js
- Obtenez une clé API gratuiteInscrivez-vous et copiez-la depuis votre tableau de bord.
- Stockez-la dans une variable d'environnement
PDF_SUMMARIZE_KEY. - Créez un FormDataAjoutez le PDF en tant que Blob sous le champ
file. - Envoyez la requête POST et lisez le 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} pages, ${result.processing_time}s, ${result.requests_remaining} requêtes restantes`);
Générer le résumé en streaming
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));
Un point de terminaison Express pour votre propre application
Votre frontend envoie le fichier à votre serveur, qui ajoute la clé et transmet le fichier :
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: 'Aucun fichier' });
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);
Gestion des erreurs
| Statut | Signification |
|---|---|
| 400 | Fichier manquant, format non PDF ou limite de pages dépassée |
| 401 | Clé manquante ou invalide |
| 413 | Fichier trop volumineux |
| 422 | Aucun texte lisible dans le PDF |
| 429 | Limite de taux ou quota atteint — réessayez plus tard avec une temporisation exponentielle |
| 500 | Erreur de résumé temporaire — réessayez |
Questions fréquentes
Puis-je appeler l'API directement depuis le navigateur ?
Techniquement oui, mais votre clé serait visible par n'importe qui. Faites transiter les requêtes par votre backend comme dans l'exemple Express.
Est-ce compatible avec Deno, Bun ou Cloudflare Workers ?
Oui — tout environnement d'exécution prenant en charge fetch et FormData de manière standard fonctionne de la même façon.
Existe-t-il un SDK TypeScript ?
Pas encore. L'API consiste en un unique point de terminaison multipart, un petit wrapper typé autour de fetch suffit amplement.
Où se trouve la documentation de référence complète ?
Dans la documentation de l'API, qui détaille tous les paramètres et propose des exemples dans plusieurs langages.