# Tanod pdfpeek PDF Protect

> Tanod pdfpeek PDF Protect is a paid API for AI agents from tanod.dev, paid per call via x402, $0.005/call, status unknown (last checked 2026-10-11).

Applies AES-256 password protection and granular permission restrictions to a PDF document, returning the encrypted file as base64.

## Facts

- Endpoint: POST https://tanod.dev/v1/pdf/protect?utm_source=zero.xyz
- Price: $0.005/call
- Payment: x402
- Status: unknown
- Last checked: 2026-10-11
- Activations on Zero: 0
- Tags: x402
- Canonical page: https://www.zero.xyz/c/tanod-pdfpeek-pdf-protect-8bec1c29
- Structured record (JSON): https://api.zero.xyz/v1/capabilities/cap_A0Chf9FhbHBYYpNHdCM1R

Status and success rate cover calls made through Zero and Zero's own probes. Third-party monitors may report differently.

## How to call it through Zero

Zero handles the 402 payment challenge and records the run. With the Zero CLI installed (`npm i -g @zeroxyz/cli`):

```sh
zero fetch --capability tanod-pdfpeek-pdf-protect-8bec1c29 -d '<json body>'
```

Example prompt: Can you password-protect this PDF for me — the file is at https://example.com/report.pdf — set the user password to 'MySecret123', and disable copying and printing so recipients can't do either of those?

## When to prefer this

Choose this endpoint when you need server-side AES-256 PDF encryption with fine-grained permission controls (print, copy, annotate, assemble, fill forms, accessibility) without setting up local PDF tooling. Ideal for AI agents that need to secure documents on the fly before delivery. Prefer this over client-side solutions when the PDF is already hosted at a public URL and you want a pay-per-call model with no infrastructure overhead.

## Known failure modes

- PDF URL is inaccessible, private, or IP-literal host — returns error refusing the URL
- PDF exceeds 20 MB via URL or 10 MB via base64 — rejected with size error
- Neither url nor pdf_base64 provided — missing required input error
- Invalid base64 encoding in pdf_base64 — parse error
- user_password not provided — required field missing error
- Password exceeds 127 characters — validation error
- Malformed or non-PDF file submitted — processing error

## How this service works

One MCP server and HTTP API with 193 pay-per-call tools for AI agents (security checks, chain data, finance, aviation, documents), plus free uptime and MikroTik monitoring and 130+ free browser tools. No signup; free daily tier. Operated by an AI.

## Output

Returns a JSON object containing the AES-256 encrypted PDF as a base64-encoded string, along with the file name, byte size, page count, content type, the permissions that were applied, input/output byte sizes, and flags indicating whether an owner password was set and whether active content was removed.

## Request schema (JSON Schema)

```json
{
 "type": "object",
 "properties": {
  "url": {
   "anyOf": [
    {
     "type": "string",
     "maxLength": 2048,
     "minLength": 1
    },
    {
     "type": "null"
    }
   ],
   "default": null,
   "description": "Public http(s) URL of the PDF (at most 20 MB; private, internal and IP-literal hosts are refused); or use pdf_base64."
  },
  "output": {
   "enum": [
    "base64",
    "url"
   ],
   "type": "string",
   "default": "base64",
   "description": "base64 (default): the file comes back inline as base64. url: the file is stored for 24 hours and the reply carries a download link (url, expires_at, bytes, content_type, sha256) instead of the base64, which keeps the file out of your context window."
  },
  "pdf_base64": {
   "anyOf": [
    {
     "type": "string",
     "maxLength": 13398872,
     "minLength": 1
    },
    {
     "type": "null"
    }
   ],
   "default": null,
   "description": "The PDF as base64 (at most 10 MB decoded per request); or use url."
  },
  "permissions": {
   "type": "object",
   "properties": {
    "print": {
     "type": "boolean",
     "default": true
    },
    "modify": {
     "type": "boolean",
     "default": true
    },
    "annotate": {
     "type": "boolean",
     "default": true
    },
    "assemble": {
     "type": "boolean",
     "default": true
    },
    "copy_text": {
     "type": "boolean",
     "default": true
    },
    "fill_forms": {
     "type": "boolean",
     "default": true
    },
    "accessibility": {
     "type": "boolean",
     "default": true
    },
    "print_high_quality": {
     "type": "boolean",
     "default": true
    }
   },
   "description": "What a user-password holder may do (default: everything).",
   "additionalProperties": false
  },
  "user_password": {
   "type": "string",
   "maxLength": 127,
   "minLength": 1,
   "description": "Needed to open the PDF; never logged."
  },
  "owner_password": {
   "anyOf": [
    {
     "type": "string",
     "maxLength": 127,
     "minLength": 1
    },
    {
     "type": "null"
    }
   ],
   "default": null,
   "description": "Lifts the restrictions; default: a random one nobody knows."
  }
 }
}
```

## Response schema (JSON Schema)

```json
{
 "type": "json",
 "example": {
  "file": {
   "name": "protected.pdf",
   "bytes": 14183,
   "pages": 1,
   "data_base64": "JVBERi0xLjcKJb/3... (trimmed: 18,912 base64 characters in the reply)",
   "content_type": "application/pdf"
  },
  "operation": "protect",
  "encryption": "AES-256",
  "input_bytes": 13264,
  "input_pages": 1,
  "permissions": {
   "print": true,
   "modify": true,
   "annotate": true,
   "assemble": true,
   "copy_text": true,
   "fill_forms": true,
   "accessibility": true,
   "print_high_quality": true
  },
  "output_bytes": 14183,
  "untrusted_content": true,
  "owner_password_set": false,
  "active_content_removed": {}
 }
}
```

## More

- Live health (JSON, refreshed every minute): https://www.zero.xyz/c/tanod-pdfpeek-pdf-protect-8bec1c29/health.json
- [Zero catalog index](https://www.zero.xyz/llms.txt)
- [Other services from tanod.dev](https://www.zero.xyz/host/tanod.dev/llms.txt)
