ToolAssay

Extracts the text (plain or Markdown) and tables from up to 10 PDF links, with p

Extracts the text (plain or Markdown) and tables from up to 10 PDF links, with page count, title, author and dates, and flags PDFs that are scans with no text layer (use /ocr for those). Choose a page range and a length limit. $0.01 per PDF. Runs nerolabs/dataset-pdf-extract.

Answeringour last check, 2026-10-21
1 of 1checks answered this week
50 msmedian answer time
$0.01listed price per call
$0.01price it asked us

Paid test badge: not yet. The checks above are free: we call the tool without paying and read the payment request it sends back. The Verified badge needs paid calls whose answers match the promised output, and nobody can buy a badge.

Endpoint

POST https://x402-agent-tools.nerolabs.workers.dev/pdf-extract

CategorySearch and research
Provider hostx402-agent-tools.nerolabs.workers.dev
Networkseip155:8453
Payment schemesexact
Self-reported calls, 30 days0 from 0 payers (the provider's figure, not ours)

Our checks, last 30 days

DayResultHTTPAskedTime
2026-10-21 valid payment request 402$0.01 50 ms

Example input (from the provider)

{
  "body": {
    "lastPage": 1,
    "maxCharsPerPdf": 2000,
    "pdfUrls": [
      "https://www.irs.gov/pub/irs-pdf/fw9.pdf"
    ]
  },
  "bodyType": "json",
  "method": "POST",
  "type": "http"
}

Promised output schema (from the provider)

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "input": {
      "additionalProperties": false,
      "properties": {
        "body": {
          "additionalProperties": false,
          "properties": {
            "extractTables": {
              "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.",
              "type": "boolean"
            },
            "firstPage": {
              "description": "Start reading at this page (1 is the first). Leave empty to read from the beginning.",
              "minimum": 1,
              "type": "integer"
            },
            "includePageText": {
              "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.",
              "type": "boolean"
            },
            "lastPage": {
              "description": "Stop reading after this page. Leave empty to read to the end. Handy for taking only the first few pages of long reports.",
              "minimum": 1,
              "type": "integer"
            },
            "maxCharsPerPdf": {
              "default": 200000,
              "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.",
              "maximum": 2000000,
              "minimum": 500,
              "type": "integer"
            },
            "minTableRows": {
              "default": 3,
              "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.",
              "maximum": 50,
              "minimum": 2,
              "type": "integer"
            },
            "pdfUrls": {
              "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.",
              "type": "array"
            },
            "textFormat": {
              "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.",
              "enum": [
                "plain",
                "markdown",
                "none"
              ],
              "type": "string"
            }
          },
          "required": [
            "pdfUrls"
          ],
          "type": "object"
        },
        "bodyType": {
          "enum": [
            "json",
            "form-data",
            "text"
          ],
          "type": "string"
        },
        "method": {
          "enum": [
            "POST"
          ],
          "type": "string"
        },
        "type": {
          "const": "http",
          "type": "string"
        }
      },
      "required": [
        "type",
        "method",
        "bodyType",
        "body"
      ],
      "type": "object"
    },
    "output": {
      "properties": {
        "example": {
          "type": "object"
        },
        "type": {
          "type": "string"
        }
      },
      "required": [
        "type"
      ],
      "type": "object"
    }
  },
  "required": [
    "input"
  ],
  "type": "object"
}

This page as JSON