Protect privacy and compliance at cloud speed. Smart redaction pinpoints and permanently removes sensitive content in any PDF — no DevOps, no guesswork.
Built for seamless integration
Use a simple API to sign and validate documents in your own platform or automate it with tools like Zapier, without dealing with complex signature logic or infrastructure.
Drop a PDF named document.pdf into your project folder, or use our sample file to get started.
The file name is case sensitive. Make sure the file name matches the file name in the sample code.The file name is case sensitive. Make sure the file name matches the file name in the sample code.
package com.example.pspdfkit;
import java.io.File;
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;
import org.json.JSONArray;
import org.json.JSONObject;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
public final class PspdfkitApiExample {
public static void main(final String[] args) throws IOException {
final RequestBody body = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart(
"file1",
"document.pdf",
RequestBody.create(
MediaType.parse("application/pdf"),
new File("document.pdf")
)
)
.addFormDataPart(
"data",
new JSONObject()
.put("documents", new JSONArray()
.put(new JSONObject()
.put("documentId", "file1")
)
)
.put("criteria", "All personally identifiable information").toString()
)
.build();
final Request request = new Request.Builder()
.url("https://api.nutrient.io/ai/redact")
.method("POST", body)
.addHeader("Authorization", "Bearer your_api_key_here")
.build();
final OkHttpClient client = new OkHttpClient()
.newBuilder()
.build();
final Response response = client.newCall(request).execute();
if (response.isSuccessful()) {
Files.copy(
response.body().byteStream(),
FileSystems.getDefault().getPath("result.pdf"),
StandardCopyOption.REPLACE_EXISTING
);
} else {
// Handle the error
throw new IOException(response.body().string());
}
}
}
using System;
using System.IO;
using System.Net;
using RestSharp;
namespace PspdfkitApiDemo
{
class Program
{
static void Main(string[] args)
{
var client = new RestClient("https://api.nutrient.io/ai/redact");
var request = new RestRequest(Method.POST)
.AddHeader("Authorization", "Bearer your_api_key_here")
.AddFile("file1", "document.pdf")
.AddParameter("data", new JsonObject
{
["documents"] = new JsonArray
{
new JsonObject
{
["documentId"] = "file1"
}
},
["criteria"] = "All personally identifiable information"
}.ToString());
request.AdvancedResponseWriter = (responseStream, response) =>
{
if (response.StatusCode == HttpStatusCode.OK)
{
using (responseStream)
{
using var outputFileWriter = File.OpenWrite("result.pdf");
responseStream.CopyTo(outputFileWriter);
}
}
else
{
var responseStreamReader = new StreamReader(responseStream);
Console.Write(responseStreamReader.ReadToEnd());
}
};
client.Execute(request);
}
}
}
// This code requires Node.js. Do not run this code directly in a web browser.
const axios = require('axios')
const FormData = require('form-data')
const fs = require('fs')
const formData = new FormData()
formData.append('data', JSON.stringify({
documents: [
{
documentId: "file1"
}
],
criteria: "All personally identifiable information"
}))
formData.append('file1', fs.createReadStream('document.pdf'))
;(async () => {
try {
const response = await axios.post('https://api.nutrient.io/ai/redact', formData, {
headers: formData.getHeaders({
'Authorization': 'Bearer your_api_key_here'
}),
responseType: "stream"
})
response.data.pipe(fs.createWriteStream("result.pdf"))
} catch (e) {
const errorString = await streamToString(e.response.data)
console.log(errorString)
}
})()
function streamToString(stream) {
const chunks = []
return new Promise((resolve, reject) => {
stream.on("data", (chunk) => chunks.push(Buffer.from(chunk)))
stream.on("error", (err) => reject(err))
stream.on("end", () => resolve(Buffer.concat(chunks).toString("utf8")))
})
}
Drop in one endpoint and ship ironclad redaction in minutes. Follow our getting started instructions to secure every document without slowing release cycles.
Why AI-grade redaction?
Traditional pattern-matching misses context. Our model recognizes real-world entities (PII, financial data, health records), and then scorches them out with audit-ready precision. GDPR, HIPAA, and SOC 2 boxes: checked.
Redaction happens in three friction-free steps
Scan
The engine analyzes every page for protected data patterns.
Decide
Flag findings for review, or auto-apply marks based on your rules.
Erase
Redactions are burned in, returning a share-safe PDF forever.
Out-of-the-box entity detection that adapts to your data
Personal data
Names, phones, emails, and full PII
Payment information
Credit card and bank details
Medical terms
PHI down to ICD codes
Custom entities
Train the model on industry-specific definitions
Apply with confidence
Toggle between automatic wipes or human-in-the-loop staging — either way, exported PDFs carry zero retrievable sensitive data
Security is our top priority
No document storage
No input or resulting documents are stored on our infrastructure. All files are deleted as soon as a request finishes. Alternatively,
check out
our self-hosted product.
HTTPS encryption
All communication between your application and Nutrient is done via HTTPS to ensure your data is encrypted when it’s sent to us.
Safe payment processing
All payments are handled by Paddle. Nutrient DWS Processor API never has direct access to any of your payment data.
Ready to try it?
Create an account to get your API key and start making API calls.