API reference

Seven PDF operations behind one endpoint shape, plus an MCP server for agents. Base URL: https://paperpipe.amaryx.com. A machine-readable summary is at /llms.txt.

Quickstart

Create a key on your dashboard, then merge two PDFs:

terminal
$ export PAPERPIPE_KEY=pp_YOUR_KEY
$ curl https://paperpipe.amaryx.com/api/v1/merge \
    -H "Authorization: Bearer $PAPERPIPE_KEY" \
    -F file=@q3-invoice-0412.pdf \
    -F file=@signed-lease.pdf \
    -o merged.pdf

The response body is the file. If something goes wrong you get JSON instead, see Errors.

Authentication

Send your API key as a bearer token on every request:

header
Authorization: Bearer pp_YOUR_KEY

Keys start with pp_. Create and delete them on the dashboard, up to 10 per account. A key is shown once when you create it and we keep only a hash, so store it somewhere safe. Keys can only be created once your email address is confirmed.

The dashboard itself calls the same endpoints with your login session instead of a key.

Operations

Every operation is POST /api/v1/{op} with a multipart/form-data body. Send input files as repeated file parts, in order. Send options as plain form fields. A successful response is the result file. Each operation costs 1 operation of your quota, except office-to-pdf, which costs 5. Failed calls cost nothing.

merge

POST/api/v1/merge1 operation

Combines two or more PDFs into one, in the order you send them. No options.

merge
$ curl https://paperpipe.amaryx.com/api/v1/merge \
    -H "Authorization: Bearer $PAPERPIPE_KEY" \
    -F file=@cover-letter.pdf \
    -F file=@q3-invoice-0412.pdf \
    -F file=@signed-lease.pdf \
    -o merged.pdf

split

POST/api/v1/split1 operation

Splits one PDF into several and returns them as a ZIP. Give either ranges or every, not both.

FieldValueDescription
rangestextPage ranges, one output file each, like 1-3,5,7-. 7- means page 7 to the end.
everynumberSplit into chunks of this many pages, like 2.
split
$ curl https://paperpipe.amaryx.com/api/v1/split \
    -H "Authorization: Bearer $PAPERPIPE_KEY" \
    -F file=@board-pack-2026-q3.pdf \
    -F ranges="1-3,5,7-" \
    -o board-pack-parts.zip

organize

POST/api/v1/organize1 operation

Reorders, deletes and rotates pages of one PDF.

FieldValueDescription
pagestextThe new page order, like 3,1,2,4-6. Pages you leave out are deleted. Leave the field out to keep every page.
rotatetextRotations as page:degrees, like 1:90,3:180. Degrees are multiples of 90 and pages use the original numbering.
organize
$ curl https://paperpipe.amaryx.com/api/v1/organize \
    -H "Authorization: Bearer $PAPERPIPE_KEY" \
    -F file=@scan-0007.pdf \
    -F pages="3,1,2,4-6" \
    -F rotate="1:90" \
    -o scan-0007-fixed.pdf

compress

POST/api/v1/compress1 operation

Makes one PDF smaller.

FieldValueDescription
levellossless (default), balanced, smalllossless loses no quality. balanced downsamples images to 150 dpi and small to 96 dpi.
compress
$ curl https://paperpipe.amaryx.com/api/v1/compress \
    -H "Authorization: Bearer $PAPERPIPE_KEY" \
    -F file=@site-survey-photos.pdf \
    -F level=balanced \
    -o site-survey-photos-small.pdf

images-to-pdf

POST/api/v1/images-to-pdf1 operation

Turns JPG, PNG, WebP and TIFF images into one PDF, one image per page, in the order you send them.

FieldValueDescription
page_sizefit (default), a4, letterfit makes each page the size of its image.
margin_mmnumberMargin around each image in millimetres. Default 0.
images-to-pdf
$ curl https://paperpipe.amaryx.com/api/v1/images-to-pdf \
    -H "Authorization: Bearer $PAPERPIPE_KEY" \
    -F file=@kitchen-before.jpg \
    -F file=@kitchen-after.jpg \
    -F page_size=a4 \
    -F margin_mm=10 \
    -o kitchen.pdf

pdf-to-images

POST/api/v1/pdf-to-images1 operation

Renders pages of one PDF as images. The response is a single image when the result has one page and a ZIP when it has more.

FieldValueDescription
formatpng (default), jpgImage format.
dpi72 to 300Resolution. Default 150.
pagestextOnly these pages, like 1-3. Leave out for all pages.
pdf-to-images
$ curl https://paperpipe.amaryx.com/api/v1/pdf-to-images \
    -H "Authorization: Bearer $PAPERPIPE_KEY" \
    -F file=@brochure-spring.pdf \
    -F format=jpg \
    -F dpi=200 \
    -F pages="1-2" \
    -o brochure-pages.zip

office-to-pdf

POST/api/v1/office-to-pdf5 operations

Converts one document to PDF. Supported types: doc, docx, xls, xlsx, ppt, pptx, odt, ods, odp, rtf, csv and txt. No options. This operation costs 5 because it runs a full office suite.

office-to-pdf
$ curl https://paperpipe.amaryx.com/api/v1/office-to-pdf \
    -H "Authorization: Bearer $PAPERPIPE_KEY" \
    -F file=@service-agreement-v3.docx \
    -o service-agreement-v3.pdf

Usage

GET/api/v1/usage

Returns how many operations you have used this month. It does not count against your quota.

usage
$ curl https://paperpipe.amaryx.com/api/v1/usage \
    -H "Authorization: Bearer $PAPERPIPE_KEY"
{"used": 118, "quota": 1000, "resets_at": "2026-11-01T00:00:00Z"}

Errors

Errors are JSON with the same two fields everywhere. error is written for people, so you can show it as it is. code is stable, so you can branch on it.

402 response
{
  "error": "You've used this month's 250 operations. Upgrade at https://paperpipe.amaryx.com/#account for more.",
  "code": "quota_exceeded"
}
StatusCodeMeaning
400bad_inputA field is missing or invalid, such as a bad page range.
400unsupported_typeThe file is not the type the operation needs.
400encrypted_pdfThe PDF is password-protected.
400too_many_pagesThe job has more pages than the per-request limit.
400fetch_failedMCP only. A file URL could not be downloaded.
401unauthorizedThe key is missing, wrong or deleted.
402quota_exceededThe monthly quota is used up.
404unknown_opThere is no such operation.
404expiredAn MCP download link has expired.
413too_largeThe request is over your plan's size limit.
422processing_failedThe file is damaged or uses features we can't process.
503busy, unavailableThe service is busy or the file worker is not available. Retry shortly.
504timeoutThe file took too long. Try a smaller file or fewer pages.

Limits and quotas

PlanOperations a monthPriceRequest size
Free250€025 MB
Starter1,000€9/month100 MB
Growth5,000€29/month100 MB
Scale25,000€99/month100 MB

Prices are in euros and include VAT. Request size is the total of all files in one request. Quotas reset on the 1st of each month (UTC). Every operation costs 1, except office-to-pdf at 5, and failed calls are free.

MCP

paperpipe is a remote MCP server over Streamable HTTP, so an agent can use the operations as tools. It takes the same Authorization: Bearer pp_... key as the REST API.

POSThttps://paperpipe.amaryx.com/mcp

Claude Code

terminal
$ claude mcp add --transport http paperpipe https://paperpipe.amaryx.com/mcp \
    --header "Authorization: Bearer pp_YOUR_KEY"

Cursor

Add this to ~/.cursor/mcp.json, or to .cursor/mcp.json in a project:

mcp.json
{
  "mcpServers": {
    "paperpipe": {
      "url": "https://paperpipe.amaryx.com/mcp",
      "headers": { "Authorization": "Bearer pp_YOUR_KEY" }
    }
  }
}

Other clients

Any client that supports Streamable HTTP can connect with the url and headers shown above. The key is sent in the Authorization header. Check your client's documentation for where it keeps its MCP server list.

Tools

Every tool takes a files list. Each item is {"url": "https://..."} for a public URL, or {"base64": "...", "filename": "signed-lease.pdf"} for content you hold. Options are the same as the REST fields and are passed as strings.

ToolSame asOptions
merge_pdfsmergenone
split_pdfsplitranges, every
organize_pdforganizepages, rotate
compress_pdfcompresslevel
images_to_pdfimages-to-pdfpage_size, margin_mm
pdf_to_imagespdf-to-imagesformat, dpi, pages
office_to_pdfoffice-to-pdfnone (costs 5 operations)

A tool does not return the file itself. It returns a download link that is valid for 1 hour, as text and as an MCP resource link. After that the file is deleted and the link answers 404 expired.

tools/call
{
  "jsonrpc": "2.0", "id": 7, "method": "tools/call",
  "params": {
    "name": "merge_pdfs",
    "arguments": {
      "files": [
        { "url": "https://files.northgate.example/q3-invoice-0412.pdf" },
        { "base64": "JVBERi0xLjcK...", "filename": "signed-lease.pdf" }
      ]
    }
  }
}

Tool errors are returned with isError: true and the same human-readable message the REST API gives in error.

Data handling

Uploaded files are processed and deleted right away. They are not stored. Results made through MCP are kept for 1 hour so the agent can download them, then deleted.

paperpipe stores account data, API key hashes and a usage log of operation, size and time. The log holds no file names or content. It is hosted in Germany (Hetzner) and run by Amaryx, a one-person studio in Espoo, Finland. See the privacy policy and terms.