server
Start the pdftl API server
Usage
pdftl
server[port=][host=][replace][max_upload_mb=][timeout=]
Details
Starts a stateless pdftl API server. Exposes all pdftl operations over HTTP.
Syntax: server [port=<port>] [host=<host>] [replace] [max_upload_mb=<mb>] [timeout=<seconds>]
Arguments:
port: Port number to listen on (default: 4080).host: Host address to bind to (default: 127.0.0.1).replace: Shutdown an existing active server on this port before binding.max_upload_mb: Maximum accepted request body size, in megabytes (default: 100). Requests whoseContent-Lengthexceeds this are rejected with HTTP 413 before the body is read. Raise this if you routinely process very large PDFs.timeout: Maximum wall-clock seconds allowed for a single operation or pipeline request to run before it is abandoned with HTTP 504 (default: 300). The operation runs in an isolated child process; if the timeout is exceeded, that process is forcibly terminated (SIGTERM, escalating to SIGKILL if needed), so this bounds both response latency and actual CPU/memory usage of a runaway operation.
Authentication
By default the server has no authentication on any endpoint – this
is intentional for local/trusted-network use. The one exception is
binding to a non-loopback host (anything other than 127.0.0.1,
localhost, or ::1, including 0.0.0.0): in that case,
PDFTL_SERVER_SHUTDOWN_TOKEN must be set in the environment before
starting the server, or it refuses to bind at all. This exists solely to
stop an unauthenticated /v1/shutdown from being reachable from the
network; it does not gate any other endpoint.
export PDFTL_SERVER_SHUTDOWN_TOKEN="$(openssl rand -hex 32)"
pdftl server host=0.0.0.0 port=4080
Include the token on shutdown requests:
curl -X POST http://your-host:4080/v1/shutdown \
-H "X-Shutdown-Token: $PDFTL_SERVER_SHUTDOWN_TOKEN"
server replace also forwards this token automatically (read from the
same environment variable) when shutting down the instance it’s
replacing.
Calling the server from cURL
We outline how to interact with the stateless pdftl HTTP server directly
using standard curl commands.
Of course, other clients can be used.
The daemon by default binds to:
Base URL:
http://127.0.0.1:4080
1. System Operations
Query Daemon Status and Registry
To retrieve active server information, version metadata, and a dynamically reflected list of supported operations:
curl -X GET http://127.0.0.1:4080/v1/status
Shutdown the Server
To cleanly terminate the loopback socket listener administratively:
curl -X POST http://127.0.0.1:4080/v1/shutdown
If a shutdown token is configured (mandatory for non-loopback binds, see above), include it:
curl -X POST http://127.0.0.1:4080/v1/shutdown \
-H "X-Shutdown-Token: $PDFTL_SERVER_SHUTDOWN_TOKEN"
2. Document Processing Operations
All execution endpoints follow the format: POST /v1/execute/{operation}.
Payloads are submitted as multipart/form-data.
A. Zero-Input Operations (e.g., create)
Operations like create generate a new document from scratch and do not require uploading a
seed PDF. Pass configuration strings in the args field:
curl -X POST http://127.0.0.1:4080/v1/execute/create \
-F "args=[\"1(A4)\"]" \
--output blank_page.pdf
B. Single-Input Operations (e.g., crop)
To send an existing PDF file to be processed, pass the document in the file parameter.
You can submit parameters via a JSON array in the args field:
curl -X POST http://127.0.0.1:4080/v1/execute/crop \
-F "file=@input.pdf" \
-F "args=[\"10pt,20pt\"]" \
--output cropped.pdf
Tip: If the operation returns a modified PDF, write it directly to a file using
--outputor stream it.
C. Multi-Input Operations (e.g., cat)
The server dynamically translates named form-data parts (e.g. A, B)
into operational handle aliases.
This allows you to upload multiple files at once and reference them in your sequence arguments:
curl -X POST http://127.0.0.1:4080/v1/execute/cat \
-F "A=@first.pdf" \
-F "B=@second.pdf" \
-F "args=[\"A\", \"B\"]" \
--output merged.pdf
Selective Page Splicing
You can also reference page-specific slices inside your handles:
curl -X POST http://127.0.0.1:4080/v1/execute/cat \
-F "A=@first.pdf" \
-F "B=@second.pdf" \
-F "args=[\"A1-3\", \"B2-end\"]" \
--output spliced.pdf
D. JSON Extraction Operations (e.g., dump_data)
For operations that return structural text or JSON payloads instead of a PDF file, the server responds with raw text/JSON containing metadata content:
curl -X POST http://127.0.0.1:4080/v1/execute/dump_data \
-F "file=@input.pdf" \
-F "args=[\"json\"]"
E. Pipelines (multiple operations in one request)
To chain several operations together server-side — without downloading and
re-uploading an intermediate file — POST to /v1/execute/pipeline instead
of a single operation name. The args field becomes a JSON array of step
objects, each naming an operation and its own args:
curl -X POST http://127.0.0.1:4080/v1/execute/pipeline \
-F "A=@first.pdf" \
-F "B=@second.pdf" \
-F 'args=[{"operation": "cat", "args": ["A", "B"]}, {"operation": "rotate", "args": ["left"]}]' \
--output merged_rotated.pdf
Uploaded file handles (A, B, …) are visible to every step, matching
the handle behaviour of the CLI pipeline. Each step after the first
implicitly receives the previous step’s output, unless it specifies its
own inputs list of handle names.
The final step may include an options object to control output
encryption, e.g. {"operation": "rotate", "args": ["right"], "options": {"owner_pw": "secret", "encrypt_aes256": true}}.
3. Limits
Requests exceeding max_upload_mb receive HTTP 413. Requests whose
operation runs longer than timeout seconds receive HTTP 504.
Examples
Start the server on default localhost:4080.
pdftl server
Shutdown any active server on port 8080, then start binding to all interfaces. Requires PDFTL_SERVER_SHUTDOWN_TOKEN to be set in the environment, since host is non-loopback.
pdftl server port=8080 host=0.0.0.0 replace
Start on default localhost:4080 with higher upload/timeout limits.
pdftl server max_upload_mb=500 timeout=600
Tags: server, utility
Source: pdftl.operations.server_op
Read online: https://pdftl.readthedocs.io/en/latest/operations/server.html
Type: Operation