Compress a PDF with curl
Make a PDF smaller by downsampling its images. Choose how far: screen (smallest), ebook, printer or prepress. Here is the whole call with curl, with the output it produced when we ran it.
Before you start
- An API key. Create a free account; it comes with free tokens every month. Put the key in an environment variable so it stays out of your code:
export BLOODWEB_KEY=your_key - curl 7.76 or later (for
--fail-with-body, which makes curl stop on an error and still show the reason). - The input file in the same folder:
scan.pdf. Use your own; that is the name the code expects.
The code
Save it as pdf-compress.sh and run bash pdf-compress.sh.
curl -sS --fail-with-body \
-H "Authorization: Bearer $BLOODWEB_KEY" \
-F file=@scan.pdf \
-F level=ebook \
https://bloodweb.net/api/v1/pdf-compress \
-o smaller.pdf
What you get
Tested 19 October 2026: this exact code ran against our test copy of the API, which runs the same service code as bloodweb.net, and produced this.
It writes smaller.pdf: a PDF, 3 pages, 1 KB.
Change the call
Every option the PDF compressor takes. Add or change them the same way as the ones in the code.
level: screen: images at 72 DPI, smallest. ebook: 150 DPI, good for email. printer: 300 DPI. prepress: 300 DPI, colour kept for print shops. One of: screen, ebook, printer, prepress.grayscale: Convert everything to shades of grey. Often halves a scanned colour document again.
If it fails
A failed call is not charged. The answer is JSON with an error object; curl stops with an error, and that JSON lands in smaller.pdf instead of the result, so open it as text to read the reason. The usual ones:
- 401
missing_keyorinvalid_key:BLOODWEB_KEYis not set in the shell that runs the code, or the key was revoked. - 415
unsupported_type: the file is not a type this service reads. The type is read from the file itself, so renaming a file does not change it. - 413
file_too_large: the file is over the limit on the service page. - 402
insufficient_tokens: the balance does not cover the call. Top up in the dashboard. - 429
rate_limited: too many calls at once. Wait the seconds in theRetry-Afterheader and send it again.
Every code and its fix is in the docs.
Next
- The PDF compressor page: every option, the limits, and Try it now in your browser.
- Getting started: keys, errors and rate limits for all the services.