Stop paying frontier-model prices to flatten a PDF.
cputools is where agents and devs offload the grunt work — and pay CPU
prices, not token prices. Stateless utilities behind one endpoint: one
call, a fraction of a cent, no server to babysit. PDF today, more landing
weekly. One balance, pay per call.
curl -X POST https://api.relaystation.ai/v1/pdf/merge \
-H 'X-Payment: <base64 EIP-3009 auth>' \
-H 'Idempotency-Key: merge-invoices-20260605' \
-H 'Content-Type: application/json' \
-d '{"files":[{"inline":"<base64 pdf>"},{"inline":"<base64 pdf>"}]}' Tools you could self-host.
PDF ops built on open-source pdf-lib and pdf.js. No Lambda layer to wrangle, no native binary to compile into your image, no cold-start tax on your own infra. One HTTPS call, a result back, done.
Learn more →
Fractions of a cent, no minimum.
From $0.0002 per call, pay per call. No subscription, no minimum, no commitment. One Relaystation balance funds cputools and every other Relaystation product.
Learn more →
Agent-native.
x402 per-call payment, OpenAPI 3.1, and llms.txt. Send a file inline (base64, ≤ 4 MB) or by storage reference for larger ones; get the result back the same way. Never created an account.
Learn more →
x402 ·OpenAPI 3.1 ·llms.txt
The tools, one endpoint
97 operations across nine categories — PDF, CSV, image, codes,
utils, generate, archive, data, and text — plus a pipeline
runtime that composes them, each a single POST to
https://api.relaystation.ai/v1/<category>/<op>. Send a
file inline (base64, ≤ 4 MB) or by storage reference for
larger files (≤ 50 MB); get the result back the same way.
PDF /v1/pdf/<op>
| Tool | What it does | Price |
| merge | Combine PDFs into one | $0.0010 / page |
| split | Split by ranges or burst to single pages | $0.0010 / page |
| rotate | Rotate pages | $0.0010 / page |
| pages | Delete, reorder, or insert pages | $0.0010 / page |
| watermark | Stamp text on pages | $0.0010 / page |
| form | Fill or flatten PDF forms | $0.0010 / page |
| extract-text | Pull text + structure out of a PDF | $0.0020 / page |
| metadata | Read or set document metadata | $0.0010 flat |
| encrypt | Password-protect a PDF (256-bit AES) | $0.0010 / page |
| decrypt | Remove a PDF password | $0.0010 / page |
| compress | Recompress to shrink a PDF | $0.0010 / page |
| repair | Repair a damaged PDF (diagnose + rewrite) | $0.0010 / page |
| render | Rasterize pages to PNG/JPEG | $0.0010 / page |
| ocr | Extract text from a scanned PDF (Tesseract) | $0.0030 / page |
| ocr-searchable | Make a scanned PDF searchable (invisible OCR text layer) | $0.0040 / page |
| from-html | Render HTML → PDF (headless Chromium, sandboxed) | $0.0030 flat |
| from-office | Convert an Office file → PDF (LibreOffice) | $0.0050 flat |
| images | Extract embedded images → PNGs | $0.0010 / page |
| diff | Text-compare two PDFs (unified diff) | $0.0010 / page |
| bookmarks | Read the outline / bookmark tree | $0.0010 flat |
| attachments | List / extract embedded file attachments | $0.0010 flat |
| verify-signatures | Verify digital signatures (structural + digest; no CA store) | $0.0010 flat |
Office /v1/office/<op>
| Tool | What it does | Price |
| rescue | Best-effort convert an exotic/legacy office file → PDF (LibreOffice) | $0.0080 flat |
CSV /v1/csv/<op>
| Tool | What it does | Price |
| convert | Convert between csv / tsv / json / ndjson | $0.0002 / MB |
| dedupe | Drop duplicate rows (order-preserving) | $0.0002 / MB |
| select | Keep, drop, or reorder columns | $0.0002 / MB |
Image /v1/image/<op>
| Tool | What it does | Price |
| resize | Resize / fit an image (animated GIF/WebP preserved with animated:true) | $0.0003 / MP |
| convert | Convert image format (png/jpeg/webp/avif/…; animated frames preserved with animated:true) | $0.0003 / MP |
| compress | Re-encode at lower quality | $0.0003 / MP |
| rotate | Rotate / flip an image | $0.0003 / MP |
| metadata | Read dimensions / format / EXIF presence | $0.0005 flat |
| crop | Crop a region | $0.0003 / MP |
| blur | Gaussian blur | $0.0003 / MP |
| sharpen | Sharpen | $0.0003 / MP |
| grayscale | Convert to grayscale | $0.0003 / MP |
| exif-strip | Strip EXIF/metadata (auto-orient first) | $0.0003 / MP |
| dominant-color | Get the dominant color | $0.0002 flat |
| composite | Overlay / watermark one image onto another | $0.0003 / MP |
| contact-sheet | Tile images into a thumbnail-grid PNG | $0.0003 / MP |
| ocr | Extract text from an image (Tesseract, 10 languages) | $0.0030 flat |
| from-html | Render HTML → image (headless Chromium screenshot, sandboxed) | $0.0030 flat |
| adjust | Adjust brightness / saturation / hue / lightness / negate / tint | $0.0003 / MP |
| trim | Auto-crop uniform borders | $0.0003 / MP |
| extend | Pad / extend on any side | $0.0003 / MP |
Codes /v1/{qr,barcode,codes/<op>}
| Tool | What it does | Price |
| qr | Generate a QR code (PNG/SVG) | $0.0002 flat |
| barcode | Generate a 1D barcode (Code128/EAN/UPC/…) | $0.0002 flat |
| qr-decode | Read a QR code from an uploaded image | $0.0002 flat |
| color-convert | Convert a color between hex / rgb / hsl | $0.0002 flat |
Utils /v1/utils/<op>
| Tool | What it does | Price |
| hash | Hash bytes (sha256/sha512/sha1/md5) | $0.0002 / MB |
| hmac | Keyed HMAC (sha256/sha512/sha1/md5); key never logged | $0.0002 / MB |
| base64 | Base64 encode / decode a string | $0.0002 / MB |
| uuid | Generate v4 UUIDs | $0.0001 flat |
| jwt-decode | Decode a JWT header + payload (no verify) | $0.0001 flat |
| jwt-verify | Verify a JWT signature, alg-pinned; key never logged | $0.0001 flat |
Generate /v1/generate/<op>
| Tool | What it does | Price |
| og-image | Render a social-card PNG (satori → sharp) | $0.0005 flat |
| mock-data | Generate fake rows from a field→type schema (json/csv/ndjson) | $0.0002 flat |
| invoice | Render an invoice PDF from structured data (pdf-lib) | $0.0002 flat |
| chart | Render a bar / line / pie chart PNG (SVG → sharp) | $0.0002 flat |
| qr-logo | QR code with a logo composited in the center (ECC H) | $0.0002 flat |
| favicon | Favicon set (PNGs) from an image or initials text | $0.0002 flat |
| placeholder | Placeholder image (dimensions/label text; png or svg) | $0.0002 flat |
| identicon | Deterministic GitHub-style identicon PNG from a seed | $0.0002 flat |
Archive /v1/archive/<op>
| Tool | What it does | Price |
| zip | Zip 1+ files into one archive | $0.0002 / MB |
| unzip | Extract a zip to a manifest of entries | $0.0002 / MB |
| gzip | Gzip compress / decompress a file (transparent gzip handling for CSV inputs) | $0.0002 / MB |
Data /v1/data/<op>
| Tool | What it does | Price |
| filter | Keep rows matching a structured predicate (no formula eval) | $0.0002 / MB |
| sort | Sort rows by one or more columns | $0.0002 / MB |
| groupby | Group rows and aggregate (count/sum/avg/min/max) | $0.0002 / MB |
| join | Join two tables (inner/left/right/outer) | $0.0002 / MB |
| union | Concatenate tables (ordered key-union schema) | $0.0002 / MB |
| profile | Column stats: type, nulls, cardinality, min/max/mean | $0.0002 / MB |
| cast | Coerce column types (string/integer/number/boolean/date) | $0.0002 / MB |
| pivot | Reshape long↔wide (pivot / unpivot) | $0.0002 / MB |
| schema-infer | Infer a JSON Schema or SQL DDL from the data | $0.0002 / MB |
| validate | Check rows against a structured schema | $0.0002 / MB |
| diff | Row-level changeset between two tables | $0.0002 / MB |
| from-xlsx | Parse an Excel file → table (csv/json) | $0.0002 / MB |
| to-xlsx | Write a table → Excel (.xlsx), formula-injection-safe (multi-sheet + styling) | $0.0002 / MB |
| derive | Add computed columns (structured, no formula eval) | $0.0002 / MB |
| fillna | Fill empty cells (value / ffill / bfill / mean / median / mode) | $0.0002 / MB |
| dropna | Drop rows with empty cells | $0.0002 / MB |
| rename | Rename columns | $0.0002 / MB |
| slice | Row slicing / sampling (offset/limit/head/tail/sample) | $0.0002 / MB |
| explode | Unnest an array/list cell into multiple rows | $0.0002 / MB |
| sample | Sample rows (n or fraction; random/head/systematic; reproducible seed) | $0.0002 / MB |
| sql | Query your file with full SQL (sandboxed DuckDB, read-only; parquet in & out) | $0.0005 / MB |
Text /v1/text/<op>
| Tool | What it does | Price |
| case | Recase text (upper/lower/title/camel/snake/kebab) | $0.0002 / MB |
| slugify | URL-slugify text (strip diacritics, hyphenate) | $0.0002 / MB |
| diff | Unified diff of two strings | $0.0002 / MB |
| apply-patch | Apply a unified diff to a source string (422 on context mismatch) | $0.0002 / MB |
| merge3 | Three-way merge of two changes against a common base (conflict markers on overlap) | $0.0002 / MB |
| count | Count characters / words / lines + reading time | $0.0002 / MB |
| regex-extract | Extract regex matches (ReDoS-guarded; patterns + input bounded) | $0.0002 / MB |
| template | Render a logic-less mustache-subset template (no eval) | $0.0002 / MB |
| markdown-to-html | Markdown → HTML, always whitelist-sanitized | $0.0002 / MB |
| html-to-text | Convert HTML → plain text | $0.0002 / MB |
| sanitize-html | Sanitize HTML against a safe whitelist | $0.0002 / MB |
Per-page, per-MB, and per-megapixel pricing; QR, barcode, metadata,
UUIDs, JWT, and generate are flat. OCR is synchronous (≤ 5 pages);
render is capped at 40 pages; unzip is bomb-guarded (≤ 128 MiB
uncompressed, rejected pre-charge). The data
category adds dataframe verbs and full sandboxed SQL
(DuckDB, read-only over your file). Office, web-render, and media tenants
are next. See the docs for every op.
A transform platform, not just a catalog
The data/sql op runs full SQL over your
file on a real DuckDB engine — locked read-only with no filesystem,
network, or extension access, so your query sees only your data. And the
pipeline runtime chains transforms into one call —
filter → groupby → convert in a single request, billed as the sum
of the steps, atomic. Compose the catalog instead of orchestrating it yourself.
Generate documents, not just transform them
HTML→PDF renders your HTML to a print-ready PDF on
a sandboxed headless Chromium — invoices, reports, contracts, certificates, from
a template and your data, no browser to host. And the
data category now speaks Excel
(from-xlsx / to-xlsx), the format every spreadsheet
lives in. cputools makes the document, not just the bytes.
Pricing in one line
From $0.0002 per call. No subscription, no minimum, no
commitment. Pay per call with x402, or top up with a card via Stripe —
one Relaystation balance funds cputools and every other Relaystation
product.
See the full pricing → Discover the API
- Overview — what cputools is, the
lodestone one-call flow, the full tool roster, and pricing in one read.
- PDF tools ·
CSV tools ·
image tools ·
QR & barcode ·
utils ·
generate ·
archive ·
data ·
data/SQL ·
pipeline — every op: inputs,
outputs, billing unit, caps, and copy-paste examples.
- MCP tools — the full cputools
roster is callable over MCP at
https://api.relaystation.ai/mcp;
copy-paste client config for Claude, Cursor, Cline, and more.
- API reference — cputools’ OpenAPI
3.1 surface with a try-it console.
- llms.txt + llms-full.txt — agent-friendly discovery surfaces.
-
Chassis concepts — x402 wire format, authentication modes, and MCP live on the
Relaystation docs.