# Tanod pdfpeek PDF Attachments

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

List, extract, or add embedded file attachments in a PDF document

## Facts

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

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-attachments-dfa21484 -d '<json body>'
```

Example prompt: Can you list all the attachments embedded in this PDF — https://example.com/report.pdf — and tell me their names, sizes, and file types?

## When to prefer this

Use this endpoint when you need to programmatically manage embedded file attachments within PDF documents — listing what's there, extracting a specific attachment by name, or embedding a new file into an existing PDF. Prefer this over general PDF text extraction tools when the goal is the attachment layer specifically, not the page content. Useful for document workflows where PDFs serve as containers for associated files (e.g. XML invoices, spreadsheets, JSON metadata).

## Known failure modes

- PDF URL unreachable or returns non-200 — request fails with error
- PDF exceeds 20 MB size limit — rejected
- Private/internal/IP-literal host URLs refused for security
- Base64-encoded PDF exceeds 10 MB decoded limit — rejected
- Attachment name contains / or \ — rejected for 'add' action
- Named attachment not found for 'extract' action — error returned
- Malformed or non-PDF file submitted — processing error
- Combined inline PDF + attachment base64 exceeds 10 MB — rejected

## 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

A JSON object containing the action performed, attachment list with name/size/filename/MIME type/description fields, total input byte count, page count of the PDF, whether results were truncated, and a flag indicating untrusted content. For 'extract' action, returns the attachment content as base64. For 'add' action, returns the modified PDF.

## 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."
  },
  "name": {
   "anyOf": [
    {
     "type": "string",
     "maxLength": 255,
     "minLength": 1
    },
    {
     "type": "null"
    }
   ],
   "default": null,
   "description": "extract / add: the attachment's name (add: a new one; no / or \\)."
  },
  "action": {
   "enum": [
    "list",
    "extract",
    "add"
   ],
   "type": "string",
   "default": "list",
   "description": "list (default): names, sizes and media types; extract: one attachment by `name`, base64; add: attach `file_base64` as `name` (the attachments the PDF has are kept)."
  },
  "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."
  },
  "mime_type": {
   "anyOf": [
    {
     "type": "string",
     "maxLength": 127,
     "minLength": 3
    },
    {
     "type": "null"
    }
   ],
   "default": null,
   "description": "add: its media type (default: guessed from the name)."
  },
  "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."
  },
  "description": {
   "anyOf": [
    {
     "type": "string",
     "maxLength": 300,
     "minLength": 1
    },
    {
     "type": "null"
    }
   ],
   "default": null,
   "description": "add: a short description stored with the attachment."
  },
  "file_base64": {
   "anyOf": [
    {
     "type": "string",
     "maxLength": 6666684,
     "minLength": 1
    },
    {
     "type": "null"
    }
   ],
   "default": null,
   "description": "add: the file to attach as base64 (at most 5 MB decoded; with an inline PDF the two together at most 10 MB)."
  }
 }
}
```

## Response schema (JSON Schema)

```json
{
 "type": "json",
 "example": {
  "count": 1,
  "action": "list",
  "operation": "attachments",
  "truncated": false,
  "attachments": [
   {
    "name": "notes.txt",
    "size": 40,
    "filename": "notes.txt",
    "mime_type": "text/plain",
    "description": "Sample attachment"
   }
  ],
  "input_bytes": 1480,
  "input_pages": 1,
  "untrusted_content": true
 }
}
```

## More

- Live health (JSON, refreshed every minute): https://www.zero.xyz/c/tanod-pdfpeek-pdf-attachments-dfa21484/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)
