Developer docs

Node.js Quickstart

Integrate asynchronous redaction in Node.js services.

Node.js Quickstart

Use Node.js fetch + FormData to create and process redaction jobs.

Prerequisites

  • Node.js 18+
  • A server-side environment (never expose API keys in browsers)
  • REDACT_API_KEY set in your environment

Example

import fs from 'node:fs';

const API_KEY = process.env.REDACT_API_KEY;
const BASE_URL = 'https://api.redactpdf.ai';

if (!API_KEY) {
  throw new Error('Missing REDACT_API_KEY');
}

const form = new FormData();
form.append('files', new Blob([fs.readFileSync('/absolute/path/contract.pdf')], { type: 'application/pdf' }), 'contract.pdf');
form.append('pii_categories', '["Person","Email","PhoneNumber"]');
form.append('retention', 'ephemeral');

const createResponse = await fetch(`${BASE_URL}/v1/jobs`, {
  method: 'POST',
  headers: {
    'X-API-Key': API_KEY,
    'X-Idempotency-Key': 'node-example-001',
  },
  body: form,
});

if (!createResponse.ok) {
  throw new Error(`Create job failed: ${createResponse.status} ${await createResponse.text()}`);
}

const job = await createResponse.json();
console.log('Job created', job.job_id);

let done = false;
let latest = job;
while (!done) {
  await new Promise(resolve => setTimeout(resolve, 2000));

  const statusResponse = await fetch(`${BASE_URL}/v1/jobs/${job.job_id}`, {
    headers: { 'X-API-Key': API_KEY },
  });

  if (!statusResponse.ok) {
    throw new Error(`Poll failed: ${statusResponse.status} ${await statusResponse.text()}`);
  }

  latest = await statusResponse.json();

  const hasActive = latest.documents.some(doc => ['uploaded', 'analyzing', 'redacting'].includes(doc.status));
  done = !hasActive;
}

for (const doc of latest.documents) {
  if (doc.status !== 'redacted') {
    console.log(`Skipping ${doc.file_name}: ${doc.status}`);
    continue;
  }

  const outputResponse = await fetch(`${BASE_URL}/v1/documents/${doc.id}/output`, {
    headers: { 'X-API-Key': API_KEY },
  });

  if (!outputResponse.ok) {
    throw new Error(`Download failed for ${doc.id}: ${outputResponse.status}`);
  }

  const bytes = Buffer.from(await outputResponse.arrayBuffer());
  fs.writeFileSync(`${doc.file_name.replace('.pdf', '')}-redacted.pdf`, bytes);
  console.log(`Saved ${doc.file_name}`);
}

Next steps

© Copyright 2026 Redact PDF AI. © 2025 Redact PDF AI.