Api Endpoint

Tanod pdfpeek

pdfpeek (Tanod) PDF OCR: make a scanned PDF searchable, a text layer on up to 5 pages, with the text. Use when a scanned PDF has no text layer and needs OCR so its text can be searched or read. Add output=url for a 24 h link.

Open interactive test console

Offering

Provider
tanod.dev
Method
POST
Offering type
Api Endpoint
Transport type
http
Category
General Utilities
Delivery
Not provided
Pricing model
Not provided
x402 version
2

Endpoint context

URL
https://tanod.dev/v1/pdf/ocr
MIME type
application/json
First seen
2026-10-16T01:50:24.663Z
Last seen
Tags
pdf-ocr, pdf, ocr, pdfpeek, pdf-tools, documents

Payment pricing

x402 payment terms are the authoritative price for calling this endpoint.

Payment option 1
0.01 USDC
Atomic price: 10000 · Network: eip155:8453 · Asset: USDC · Scheme: exact
Payment option 2
0.01 USDC
Atomic price: 10000 · Network: eip155:137 · Asset: USDC · Scheme: exact
Payment option 3
0.01 USDC
Atomic price: 10000 · Network: solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp · Asset: USDC · Scheme: exact
Payment option 4
0.01 USDC
Atomic price: 10000000000000000 · Network: eip155:56 · Asset: USDC · Scheme: exact
Payment option 5
0.01 USDC
Atomic price: 10000 · Network: eip155:42161 · Asset: USDC · Scheme: exact
Payment option 6
0.01 USDC
Atomic price: 10000 · Network: eip155:8453 · Asset: USDC · Scheme: exact
Payment option 7
0.01 USDC
Atomic price: 10000 · Network: eip155:137 · Asset: USDC · Scheme: exact
Raw x402 terms
[
  {
    "scheme": "exact",
    "network": "eip155:8453",
    "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
    "amount": "10000",
    "payTo": "0x593857A4a4F619543ea12394137C3004ce841720"
  },
  {
    "scheme": "exact",
    "network": "eip155:137",
    "asset": "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
    "amount": "10000",
    "payTo": "0x593857A4a4F619543ea12394137C3004ce841720"
  },
  {
    "scheme": "exact",
    "network": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",
    "asset": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
    "amount": "10000",
    "payTo": "RMk9k3VC8dr4hhjgFh88rGhjAbzfBzHxJJ5n2fTcqus"
  },
  {
    "scheme": "exact",
    "network": "eip155:56",
    "asset": "0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d",
    "amount": "10000000000000000",
    "payTo": "0x593857A4a4F619543ea12394137C3004ce841720"
  },
  {
    "scheme": "exact",
    "network": "eip155:42161",
    "asset": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
    "amount": "10000",
    "payTo": "0x593857A4a4F619543ea12394137C3004ce841720"
  },
  {
    "scheme": "exact",
    "network": "eip155:8453",
    "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
    "amount": "10000",
    "payTo": "0x593857A4a4F619543ea12394137C3004ce841720"
  },
  {
    "scheme": "exact",
    "network": "eip155:137",
    "asset": "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
    "amount": "10000",
    "payTo": "0x593857A4a4F619543ea12394137C3004ce841720"
  }
]

Observed health

Status
Healthy
Latest latency
829 ms
Average latency
611 ms
HTTP status
204
Last checked
Reachability
100% over 14 checks

Latency is measured to the first response headers. A reachable result does not verify response accuracy or merchant identity.

Input schema

{
  "additionalProperties": false,
  "properties": {
    "body": {
      "additionalProperties": false,
      "properties": {
        "dpi": {
          "default": 200,
          "description": "100-300 (default 200); at most 200 for more than 5 pages.",
          "maximum": 300,
          "minimum": 100,
          "type": "integer"
        },
        "lang": {
          "default": "eng",
          "description": "Installed tesseract languages only, '+'-joined (eng today).",
          "maxLength": 50,
          "minLength": 3,
          "pattern": "^[a-z][a-z_]{1,15}(\\+[a-z][a-z_]{1,15}){0,2}$",
          "type": "string"
        },
        "output": {
          "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.",
          "enum": [
            "base64",
            "url"
          ],
          "type": "string"
        },
        "pages": {
          "description": "Pages to OCR, at most 10, each part N, N-M, -M or last (no open N- ranges), e.g. 1-3,7. At most 5 pages is the lower price.",
          "maxLength": 200,
          "minLength": 1,
          "pattern": "^[0-9a-zA-Z ,\\-]+$",
          "type": "string"
        },
        "pdf_base64": {
          "anyOf": [
            {
              "maxLength": 13398872,
              "minLength": 1,
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The PDF as base64 (at most 10 MB decoded per request); or use url."
        },
        "skip_text": {
          "default": true,
          "description": "Leave pages that already have text alone.",
          "type": "boolean"
        },
        "url": {
          "anyOf": [
            {
              "maxLength": 2048,
              "minLength": 1,
              "type": "string"
            },
            {
              "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."
        }
      },
      "required": [
        "pages"
      ],
      "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 schema

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "input": {
      "additionalProperties": false,
      "properties": {
        "body": {
          "additionalProperties": false,
          "properties": {
            "dpi": {
              "default": 200,
              "description": "100-300 (default 200); at most 200 for more than 5 pages.",
              "maximum": 300,
              "minimum": 100,
              "type": "integer"
            },
            "lang": {
              "default": "eng",
              "description": "Installed tesseract languages only, '+'-joined (eng today).",
              "maxLength": 50,
              "minLength": 3,
              "pattern": "^[a-z][a-z_]{1,15}(\\+[a-z][a-z_]{1,15}){0,2}$",
              "type": "string"
            },
            "output": {
              "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.",
              "enum": [
                "base64",
                "url"
              ],
              "type": "string"
            },
            "pages": {
              "description": "Pages to OCR, at most 10, each part N, N-M, -M or last (no open N- ranges), e.g. 1-3,7. At most 5 pages is the lower price.",
              "maxLength": 200,
              "minLength": 1,
              "pattern": "^[0-9a-zA-Z ,\\-]+$",
              "type": "string"
            },
            "pdf_base64": {
              "anyOf": [
                {
                  "maxLength": 13398872,
                  "minLength": 1,
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "description": "The PDF as base64 (at most 10 MB decoded per request); or use url."
            },
            "skip_text": {
              "default": true,
              "description": "Leave pages that already have text alone.",
              "type": "boolean"
            },
            "url": {
              "anyOf": [
                {
                  "maxLength": 2048,
                  "minLength": 1,
                  "type": "string"
                },
                {
                  "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."
            }
          },
          "required": [
            "pages"
          ],
          "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": {
          "description": "Abridged to fit the header. Full example: the 402 JSON body. Full schema: https://tanod.dev/openapi.json POST /v1/pdf/ocr",
          "properties": {
            "active_content_removed": {
              "type": "object"
            },
            "dpi": {
              "type": "integer"
            },
            "file": {
              "type": "object"
            },
            "file_count": {
              "type": "integer"
            },
            "files": {
              "type": "array"
            },
            "input_bytes": {
              "type": "integer"
            },
            "input_pages": {
              "type": "integer"
            },
            "lang": {
              "type": "string"
            },
            "ocr_pages": {
              "type": "array"
            },
            "operation": {
              "type": "string"
            },
            "output_bytes": {
              "type": "integer"
            },
            "skipped_has_text": {
              "type": "array"
            },
            "text": {
              "type": "string"
            },
            "text_truncated": {
              "type": "boolean"
            },
            "untrusted_content": {
              "type": "boolean"
            }
          },
          "required": [
            "operation",
            "output_bytes",
            "untrusted_content",
            "file"
          ],
          "type": "object"
        },
        "type": {
          "type": "string"
        }
      },
      "required": [
        "type"
      ],
      "type": "object"
    }
  },
  "required": [
    "input"
  ],
  "type": "object"
}