xtract.bot

POST /api/pdf-encrypt2 quota units per call · cache hits free

Password-protect a PDF. Set a user password (open document) and optionally a separate owner password (change permissions). Restrict printing, modifying, or copying.

Returns a new PDF that requires the supplied user password to open and applies the requested permission restrictions when opened with that password. Two passwords are supported: - `userPassword` (required) — what an end-user types to view the document. - `ownerPassword` (optional) — privileged credential that can change permissions and remove encryption. Defaults to the user password if omitted, but supplying a distinct owner password is the standard pattern for redistributable PDFs. Permissions default to fully permissive; pass `false` for any of `allowPrinting` / `allowModifying` / `allowCopying` to lock that capability behind the owner password. PDF permission bits are advisory — most viewers honour them but they are not strictly enforced.

Inputs

NameTypeDefaultDescription
pdf*fileBase64-encoded source PDF to encrypt.
userPassword*stringPassword the end-user types to open the document. 1–256 chars.
ownerPasswordstringOwner password for permission management. Defaults to the user password if omitted. 0–256 chars.
allowPrintingbooleantrueAllow printing when opened with the user password. Default: true.
allowModifyingbooleantrueAllow modifying / annotating / form-filling. Default: true.
allowCopyingbooleantrueAllow text / image copy-out. Default: true.
ignoreEncryptionbooleanRe-encrypt an already-encrypted source. Default: false (encrypted input is rejected).

Response

Modes: binary, stream, json. Cache: yes (24h TTL).

Large outputs stream: responses over the 4 MiB cache limit are piped through as they are produced instead of buffered. They carry x-cache-skip: size and are never cached — identical follow-up calls recompute.

Every response carries x-cache (HIT / MISS / BYPASS), x-cache-signature (stable across identical inputs), and the rate-limit headers listed below.

Quota & limits

Cost per call2 units against the 10,000-unit monthly quota. Cache hits are free — only cache misses decrement.
Burst limit200 requests per rolling minute, shared across all tools.
Max request size25 MiB (base64 inflates file payloads ~33% — the limit applies to the decoded bytes).
Max response size25 MiB
Timeout20s wall clock.
Rate-limit headersX-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Burst-Limit on every response; X-Quota-Warning once 80% of the monthly quota is spent; Retry-After on 429s.

Errors

Errors are JSON with an error string; schema failures add a details object (Zod's flattened field errors).

StatusWhenBody
400Input fails the tool's schema (wrong type, missing required field, malformed base64) or the file bytes can't be parsed as the expected format.{ "error": "invalid inputs", "details": { "fieldErrors": { … } } }
401Missing or invalid X-Api-Key / X-Account-Id headers (or no session when called from the browser).{ "error": "unauthorized" }
404Unknown tool id, or calling /api/* on the website hostname instead of api.xtract.bot.{ "error": "not found" }
413Request body over the tool's max request size, or an image header declaring more megapixels than the tool's pixel budget.{ "error": "…exceeds maxRequestBytes…" }
415Content-Type isn't application/json on the json-body transport.{ "error": "unsupported content-type; expected application/json" }
429Monthly quota or the 200/min burst limit exhausted. Check Retry-After and the X-RateLimit-* headers.{ "error": "monthly quota exceeded", "monthRemaining": 0, … }
5xxConversion engine failure. Safe to retry; if it persists, the input is hitting a bug — please report it.{ "error": "…" }

Code samples

Built from the hello-with-user-password example.

# Download or substitute the example input:
#   curl -O https://xtract.bot/examples/pdf-encrypt/hello.pdf
PDF=$(base64 -w0 < hello.pdf)

curl -X POST https://api.xtract.bot/api/pdf-encrypt \
  -H "Content-Type: application/json" \
  -H "Accept: application/octet-stream" \
  -H "X-Account-Id: $XTRACT_ACCOUNT_ID" \
  -H "X-Api-Key: $XTRACT_API_KEY" \
  -d '{
  "userPassword": "user-secret",
  "ownerPassword": "owner-secret",
  "allowPrinting": true,
  "allowModifying": false,
  "allowCopying": false,
  "pdf": "'"$PDF"'"
}'