ohmywrap
Get an API key

§ 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
Request
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
Response
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 and what they cost
CallsYou pay
1,000$1
10,000$10
100,000$100
1,000,000$1,000

§ 02 How it works

One request. No job IDs.

  1. Send the file. One POST, multipart, with your key in the header.

  2. We process it in memory. Mature open source engines, hard size and page limits, refused early if we cannot do it promptly.

  3. 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.
There is no bucket to name in a data processing agreement.

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

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.

Round trip · two calls, $0.002
# 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.

Limits, SLAs, refunds, and the rest

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.