# Nero Labs PDF Extract

> Nero Labs PDF Extract is a paid API for AI agents from x402-agent-tools.nerolabs.workers.dev, paid per call via x402, $0.01/call, status unknown (last checked 2026-10-22).

Extracts plain text or Markdown (including tables) from up to 10 PDF URLs, returning metadata like page count, title, author, and dates, and flagging scan-only PDFs.

## Facts

- Endpoint: POST https://x402-agent-tools.nerolabs.workers.dev/pdf-extract?utm_source=zero.xyz
- Price: $0.01/call
- Payment: x402
- Status: unknown
- Last checked: 2026-10-22
- Activations on Zero: 0
- Tags: x402
- Canonical page: https://www.zero.xyz/c/nero-labs-pdf-extract-21b79a2c
- Structured record (JSON): https://api.zero.xyz/v1/capabilities/cap_CjkI9YpFkxpSPJEk8IbN_

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 nero-labs-pdf-extract-21b79a2c -d '<json body>'
```

Example prompt: Can you extract the text and tables from these two PDF links as Markdown, reading pages 1 through 10 only: https://example.com/report1.pdf and https://example.com/report2.pdf?

## When to prefer this

Use this endpoint when you have direct PDF URLs and need to extract readable text or structured tables from born-digital (non-scanned) PDFs. It is ideal for processing reports, invoices, forms, and research papers where preserving table structure matters. Prefer this over generic document parsers when you need Markdown-formatted tables ready for LLM consumption, per-page text, or PDF metadata like title and author. If the PDF is a scan with no text layer, use the /ocr sibling endpoint instead.

## Known failure modes

- PDF URL is inaccessible or returns a non-PDF response — extraction status will indicate failure
- PDF is a scan with no text layer — ocrRequired flag set to true, text will be empty; use /ocr endpoint instead
- More than 10 PDF URLs submitted — request may be rejected or truncated
- maxCharsPerPdf limit reached — text is cut and textTruncated flag is set
- Invalid page range (firstPage > lastPage) — may return empty or error response
- PDF is password-protected or encrypted — extraction will fail with an error status

## How this service works

Pay-per-call tools for AI agents, 31 in all: read web pages and RSS feeds, OCR, PDF text, transcription; email, phone and domain checks; UK, Irish and Polish company lookups and UK risk reports; website contacts, tech stack and SEO audits; PageSpeed; AI review, job post and row enrichment; data cleaning, joins, dedupe and diffs; US and EU compliance rules. No account or API key: pay each call in USDC on Base over x402.

## Output

A JSON object containing a rows array (one entry per PDF) with fields including extracted text, Markdown tables, page count, title, author, word count, file size in KB, table count, whether OCR is required, the extraction status, and whether text was truncated. Also includes a top-level count of processed PDFs.

## Request schema (JSON Schema)

```json
{
 "type": "object",
 "properties": {
  "pdfUrls": {
   "type": "array",
   "description": "A plain list of PDF links, for a quick one-off run with no spreadsheet. Use the dataset, file or Google Sheet inputs above to keep your own columns alongside the results."
  },
  "lastPage": {
   "type": "integer",
   "minimum": 1,
   "description": "Stop reading after this page. Leave empty to read to the end. Handy for taking only the first few pages of long reports."
  },
  "firstPage": {
   "type": "integer",
   "minimum": 1,
   "description": "Start reading at this page (1 is the first). Leave empty to read from the beginning."
  },
  "textFormat": {
   "enum": [
    "plain",
    "markdown",
    "none"
   ],
   "type": "string",
   "default": "plain",
   "description": "'Plain text' returns the reading-order text. 'Markdown' appends any detected tables as Markdown tables after the text, which is the friendliest shape for feeding an LLM. 'None' skips the text entirely, for runs that only want page counts, metadata or tables."
  },
  "minTableRows": {
   "type": "integer",
   "default": 3,
   "maximum": 50,
   "minimum": 2,
   "description": "Minimum rows before a grid counts as a table. The default of 3 is a deliberate noise floor, because printed forms are built from aligned two-line boxes and report dozens of meaningless two-row 'tables'. Lower it to 2 for invoices whose line items are one header plus one row."
  },
  "extractTables": {
   "type": "boolean",
   "default": true,
   "description": "Reconstruct tables from the position of the text on the page and return them as rows of cells. Plain text extraction loses table structure completely, so this is where most of the value is for invoices, statements and reports."
  },
  "maxCharsPerPdf": {
   "type": "integer",
   "default": 200000,
   "maximum": 2000000,
   "minimum": 500,
   "description": "Cuts the returned text at this many characters so one very long document cannot produce an unusable dataset row. The row records whether it was cut."
  },
  "includePageText": {
   "type": "boolean",
   "default": false,
   "description": "Add a 'pages' array with each page's text separately, on top of the combined text. Useful for citing a page number, and it makes rows considerably larger."
  }
 }
}
```

## Response schema (JSON Schema)

```json
{
 "type": "json",
 "example": {
  "rows": [
   {
    "pdfUrl": "https://www.irs.gov/pub/irs-pdf/fw9.pdf",
    "pdfTitle": "Form W-9 (Rev. March 2024)",
    "charCount": 5659,
    "pageCount": 6,
    "pdfAuthor": "SE:W:CAR:MP",
    "wordCount": 933,
    "fileSizeKb": 138,
    "tableCount": 3,
    "ocrRequired": false,
    "resolvedUrl": "https://www.irs.gov/pub/irs-pdf/fw9.pdf",
    "hasTextLayer": true,
    "statusDetail": null,
    "extractStatus": "ok",
    "textTruncated": true
   }
  ],
  "count": 1,
  "_example_note": "Real output, trimmed: long lists cut to their first items, fields and text shortened."
 }
}
```

## More

- Live health (JSON, refreshed every minute): https://www.zero.xyz/c/nero-labs-pdf-extract-21b79a2c/health.json
- [Zero catalog index](https://www.zero.xyz/llms.txt)
- [Other services from x402-agent-tools.nerolabs.workers.dev](https://www.zero.xyz/host/x402-agent-tools.nerolabs.workers.dev/llms.txt)
