§ PDF + image + text + office processing API
A dollar per thousand calls. Nothing kept.
29 endpoints across PDF, image, text and office. One flat price per call whatever the page count, and your file lives in memory for exactly one request.
- No card to read the docs
- Packs from $10
- No subscription
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- Status
- 200 OK
- application/pdf
- Held in memory
- 840 ms
- Cache-Control
- no-store
- Retained
- 0 bytes
- Billed
- 1 call, $0.001
29
endpoints live today
$0.001
per call, flat
0
bytes retained
§ 01 What it costs
Pages do not count. Steps do not count. Calls count.
A 3,000-page document costs the same as a one-page memo. Merging twenty files is one call. An eight-step pipeline is one call. Every other document API multiplies your bill by pages, megabytes, or compute-seconds, which is why they all ship a calculator. Ours is a multiplication table.
| Calls | You pay |
|---|---|
| 1,000 | $1 |
| 10,000 | $10 |
| 100,000 | $100 |
| 1,000,000 | $1,000 |
§ 02 How it works
One request. No job IDs.
Send the file. One POST, multipart, with your key in the header.
We process it in memory. Mature open source engines, hard size and page limits, refused early if we cannot do it promptly.
You get the file back. Same response, same connection. Then it is gone.
§ 03 Retention
Your file lives in memory for one request.
Nothing you send is written to persistent storage. PDF, image and text work never touches a filesystem at all — the bytes are a slice in memory, and the response closes over them. Office conversions are the one exception worth naming out loud: LibreOffice is not a library and will not read a document from a pipe, so a conversion gets a work directory on a private tmpfs. That is memory. It is destroyed when the request ends, whatever happened in between, and again when the service stops.
No buckets, no CDN cache, no “deleted after 24 hours,” no retention toggle in a settings page you forgot to check. We log the endpoint, timestamp, status, duration, and request ID. We do not log file contents, filenames, or passwords.
If your legal team’s first question is “where does the file go?”, the answer is nowhere.
§ 04 What you can call today
29 endpoints, live now.
Four namespaces, one request shape. Every one is a POST with your file attached, and every one costs the same.
PDF API
17 endpointsMerge, split, extract, rotate, stamp, optimize, encrypt, inspect, and chain. Runs on pdfcpu.
POST /pdf/mergeConcatenate documents in the order the file parts appear.POST /pdf/stampOverlay text or an image, on top of or underneath the content.POST /pdf/pipelineSeveral operations on one document, in one request.
Image API
7 endpointsResize, crop, rotate, composite, convert, inspect, and chain. Runs on libvips.
POST /image/resizeFit, cover, contain, fill, or outside.POST /image/convertTranscode, or re-encode in place.POST /image/pipelineOne decode, several transforms, one encode.
Text API
4 endpointsFind personal information and remove it, or tokenize it for a model and put it back after. Runs on go-phileas.
POST /text/redactFind personal information in text and replace it.POST /text/tokenizeReversible placeholders out, plus the map that reverses them.POST /text/restorePut the original values back into the model’s reply.
Office API
1 endpointMove a document between office formats, across a fixed matrix of seventeen pairs. Runs on LibreOffice.
POST /office/convertMove a document between office formats. Seventeen pairs, no guessing.
Images go in and out as JPEG, PNG, WebP, AVIF, GIF or TIFF — a deliberately small list, because every format on it is one we are willing to point at a file a stranger uploaded. The reference has the parameters, the ceilings, and every error code.
§ 05 The text API
Send the prompt. Do not send the person.
/text/tokenize replaces every email address, card number and national ID with a reversible placeholder and hands you the map. You make the model call. /text/restore puts the values back into the reply.
The map is returned to you and held nowhere here, so there is no session, no job id, and no coordination between the two calls — they can land on different workers. A repeated value gets one token, so the model still reads two mentions as the same person.
What it does not do
The rest of the text still goes to your provider in full, and structure alone can identify: “[PERSON_1], CEO of [ORGANIZATION_1], resigned after the [DATE_1] board meeting” is not anonymous to anyone who reads the news. Detection is regular expressions, so a name in running prose is not found, not tokenized, and therefore sent.
# 1. Tokenize. The mapping comes back to you; we keep none of it.
curl -sS --fail-with-body \
-H "Authorization: Bearer $OHMYWRAP_KEY" \
-F "file=@prompt.txt" \
-F 'options={"detect":["email-address","ssn"]}' \
https://api.ohmywrap.com/text/tokenize
# 2. Your model call, with nobody's name in it.
# 3. Restore. The mapping travels as its own part.
curl -sS --fail-with-body \
-H "Authorization: Bearer $OHMYWRAP_KEY" \
-F "file=@reply.txt" \
-F "mapping=@mapping.json;type=application/json" \
https://api.ohmywrap.com/text/restore/text/redact and /text/detect are the one-way pair, for when nothing should come back: a redacted transcript, or a report of what a document contains before a human sees it.
§ 06 Coming soon
Same price. Same zero retention.
PDF6 planned
Page rasterisation
Pages to PNG or JPEG. The most-asked-for gap: it needs a rendering engine, which is a much larger dependency than pdfcpu. /pdf/extract-images returns the pictures inside a document, not pictures of it.
Text extraction
The text layer out, as text or as positioned JSON.
OCR for scanned pages
Text out of a photocopy, once rasterisation exists to feed it.
Form fields, read and fill
Read the field map, post values back.
HTML to PDF
A URL or a string of markup, rendered.
Digital signatures
Sign, and verify what someone else signed.
Images4 planned
Placeholders
LQIP and a dominant colour, for the blur-up you hand-roll today.
Montage
Several images into one contact sheet.
Filters
Blur, sharpen, tint, flatten, as pipeline steps.
Frame split and rebuild
Animated GIF and WebP apart, and back together.
Misc9 planned
Named entities in text
People, organisations and places, alongside the seventeen pattern detectors that shipped. The engine finds these through an external HTTP service, which is the one feature our policy boundary exists to keep unreachable — so it is a decision, not a flag.
Face and plate blurring
The same idea as /text/redact, pointed at pixels.
Office to PDF
office/convert moves between office formats today and refuses pdf on purpose: page ranges, PDF/A and image downsampling mean nothing for five of its nine targets. Rendering is a separate endpoint with its own fidelity problem.
Redaction that understands structure
JSON, CSV and HTML go through /text/redact as text today, so a match can land inside a tag or a quoted field. Parsing them properly is its own piece of work.
Barcode and QR, read and write
Find every code in a file, or stamp one on.
Zip in, zip out
An archive of files processed in one call, at one call’s price.
Malware scan in passing
The bytes are already in memory. Scanning them is nearly free.
PDF diff
What changed between two versions of a contract.
PDF/A conversion
For the archive requirement in someone’s procurement form.
Also queued: official TypeScript and Python clients, signed upload URLs for large files, and processing in an EU region. Ask for something that is not here.
§ 07 The three questions everyone asks
Before you spend ten dollars.
Isn’t this just a wrapper?
Yes. It is in the name. You are buying the part nobody wants to own: native library builds, memory limits, CVE patches, and a worker pool that does not fall over at 3am. Ten thousand calls cost $10, which is less than the afternoon you would spend on it.
Do you train on my documents?
No. There is no model here and no corpus to train on. Your file exists in memory for the length of one request, nothing is written to persistent storage, and when the response closes it is gone.
Is there a free tier?
No. A pack is $10 and it never expires, so occasional use costs you $10 once rather than a subscription every month. We would rather sell you one pack you spend over two years than fund a free tier out of someone else’s bill.
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.