pennypdf

Developer API · $0.02 per coin

PDF operations at the cost of a notification.

Generate, convert, merge, OCR, and automate PDFs with simple API calls and low per-operation pricing.

The same catalog the web UI ships, behind a single REST endpoint. Coins never expire. No $99/month floor. No enterprise-sales call. Pay per operation, not per month.

Per operation

$0.02–$0.10

Monthly minimum

$0

Coin expiry

Never

SLAs

99.9%

Copy. Paste. Ship.

Every operation works the same way: POST a file, receive a file. Async jobs return a job_id you poll or wait on via webhook. No state machine to babysit.

curlPOST /v1/compress
# Compress a PDF (1 coin)
curl -X POST https://api.pennypdf.com/v1/compress \
  -H "Authorization: Bearer $PENNYPDF_API_KEY" \
  -F "file=@input.pdf" \
  -F "preset=medium" \
  -o output.pdf
Node.jsPOST /v1/compress
// npm i @pennypdf/sdk
import { PennyPDF } from "@pennypdf/sdk";

const client = new PennyPDF({ apiKey: process.env.PENNYPDF_API_KEY });

const result = await client.compress({
  file: fs.createReadStream("input.pdf"),
  preset: "medium",
});

await result.writeTo("output.pdf");
console.log(`Spent ${result.coinsSpent} coins (balance: ${result.coinsRemaining})`);
PythonPOST /v1/compress
# pip install pennypdf
from pennypdf import PennyPDF

client = PennyPDF(api_key=os.environ["PENNYPDF_API_KEY"])

with open("input.pdf", "rb") as f:
    result = client.compress(file=f, preset="medium")

with open("output.pdf", "wb") as out:
    out.write(result.bytes)

print(f"Spent {result.coins_spent} coins (balance: {result.coins_remaining})")
GoPOST /v1/compress
// go get github.com/pennypdf/go-sdk
import "github.com/pennypdf/go-sdk"

client := pennypdf.New(os.Getenv("PENNYPDF_API_KEY"))

file, _ := os.Open("input.pdf")
defer file.Close()

result, err := client.Compress(ctx, pennypdf.CompressOptions{
    File:   file,
    Preset: "medium",
})
if err != nil { return err }

os.WriteFile("output.pdf", result.Bytes, 0644)
fmt.Printf("Spent %d coins (balance: %d)\n", result.CoinsSpent, result.CoinsRemaining)

Pricing, compared honestly.

If you do 100+ paid operations every month, every month, a flat-rate subscription might win. If you do fewer or if your volume varies, pay-per-use is strictly cheaper — and nobody charges you the month you don't use the product.

ServiceEntry minimumPer-unit pricePay-as-you-go?
PDF.co~$9.99/moCredit bundles, overage $0.05-$0.12Only after subscription
DocRaptor$15/mo for 125 docs$0.12/doc overageNo
HyPDF$29/mo floorPer-op volume tiersNo
PDFShift$9/mo for 50 conv$0.18/conv overageNo
Adobe PDF Services$99/mo ProPer-doc + per-MBNo
PennyPDF$0.99 one-time$0.02–$0.10/coinYes, always

Competitor pricing verified as of launch; we re-check quarterly. Per-operation math: 1 coin = compress, merge, watermark; 2 coins = convert to Word/Excel; 3 coins = OCR, sign, PDF/A.

Built for real workloads.

Invoice generation

HTML → PDF conversion at 1 coin each. Render invoices from your templating engine, stream the PDF back to the customer without running a headless Chromium fleet.

Receipt OCR pipelines

OCR + text extraction at 3 coins per document. Run on scanned receipts hitting S3, get structured text back via webhook. No idle GPU instances.

Contract automation

Multi-signer e-sign at 3 coins per signer with full audit trail. Replace DocuSign's $25/seat/month with per-send pricing.

Report generation

Merge, watermark, compress, and deliver quarterly report bundles. Chain operations in a single request; only pay for the server-side steps.

What you get at $0.

  • REST + OpenAPI 3.1 spec
  • Idempotency-Key support
  • Same coin balance as the web UI
  • Webhooks with signed delivery
  • Async job polling + server-sent events
  • Per-key usage metrics in dashboard
  • Rate limits stated up-front (200 burst, 60 rpm baseline)
  • CORS pre-flight on every /v1/* route

Start with $0.99.

Sign in, get 10 free coins, issue an API key, ship your integration. When you run out, a $0.99 Mini pack is 10 more coins. Move to a Power pack ($7.99 / 200 coins) or Pro pack ($14.99 / 500 coins) when your volume asks for it.