ohmywrap
Get an API key

§ 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.

POST /pdf/merge
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.

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.

GET /
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.

Full pricing, packs, and what we never bill for

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.