§ Documentation
The whole API, in four pages and one inventory.
Every operation is a POST with your file attached, every result comes back on the same connection, and every call costs $0.001 whatever the file turns out to contain. 29 of them, across four namespaces.
Your first call
Create a key in the console, export it, and post a file. There is no SDK to install and no client to configure — the whole API is multipart over HTTPS.
curl -sS --fail-with-body -o merged.pdf \
-H "Authorization: Bearer $OHMYWRAP_KEY" \
-F "file=@invoice-jan.pdf" \
-F "file=@invoice-feb.pdf" \
https://api.ohmywrap.com/pdf/merge--fail-with-body is not decoration. Plain -o merged.pdf writes the body whatever the status is, so a failure leaves problem JSON sitting in a file named .pdf while your terminal says nothing at all.
What comes back
The result itself, on the same connection, with Cache-Control: no-store, Content-Length and X-Request-Id. Nothing is compressed — PDFs and image formats carry their own compression, and deflating them again costs CPU for nothing. Quote the request id if you ever need to ask us about a call.
The four namespaces
Same request shape, same flat price, same retention answer. Each one has an index and a page per endpoint with its options, its ceilings, and a request you can paste.
Merge, split, extract, rotate, stamp, optimize, encrypt, inspect, and chain.
on pdfcpu
POST /pdf/infoPOST /pdf/metadataPOST /pdf/validate
Image
7 endpointsResize, crop, rotate, composite, convert, inspect, and chain.
on libvips
POST /image/infoPOST /image/convertPOST /image/resize
Text
4 endpointsFind personal information and remove it, or tokenize it for a model and put it back after.
on go-phileas
POST /text/redactPOST /text/detectPOST /text/tokenize
Office
1 endpointMove a document between office formats, across a fixed matrix of seventeen pairs.
on LibreOffice
POST /office/convert
Ask the service, don’t hardcode it
GET / lists every registered operation with its arity and byte cap, plus the limits actually in force on that deployment. Read it at startup rather than copying numbers out of this page — the numbers here are the published defaults, and the service is the thing that knows.
curl -sS -H "Authorization: Bearer $OHMYWRAP_KEY" https://api.ohmywrap.com/ | jq- GET /
- Capability and limit discovery. Lists every registered operation with its arity and byte cap, plus the live limits. Read these instead of hardcoding them.
- GET /healthz
- Liveness. Always 200 while the process is up. Never gate a load balancer on this one.
- GET /readyz
- Readiness. 200 when able to accept work, 503 while draining or when the console database is unreachable. This is the one a load balancer should poll.
These three are the only routes that need no key. A health check that returns 401 takes the whole service out of rotation, and a load balancer cannot present a credential.
What a call costs you
One call, $0.001, whatever it contained. Not per page, not per megabyte, not per compute-second, not per step in a pipeline, and never for storage, because there is none. A request refused before we start work is not billed at all, and a failure after we start is compensated with a credit back on the same ledger — so a retry loop against a broken file cannot quietly drain a pack.
Every operation is a pure function of its inputs, so retries are always safe. An Idempotency-Key is available if you want a retry of yours not to be charged twice, and it is not required for correctness.
Your first call takes one line of curl.
No plan to choose. No credits to model. No storage to configure.
10,000 calls for $10. No subscription, no expiry.