ohmywrap
Get an API key

§ Limits

Published, and refused early rather than late.

Every endpoint has a hard ceiling, the service returns them so your code never has to guess, and anything above one is refused immediately instead of accepted and left to time out ninety seconds later. Refusals are not billed.

Read them from the service

The tables below are the published defaults. GET / reports what is actually in force on the deployment you are calling, which is the number that will refuse your request. Read it at startup; do not copy these into a constant.

GET / · limits
curl -sS -H "Authorization: Bearer $OHMYWRAP_KEY" https://api.ohmywrap.com/ | jq '.limits'

pdf/*

Bytes per file
20 MB
Bytes per request
60 MB
Files per request
20
Pages per request
3,000
Split output documents
100
Pipeline steps
8

image/*

Bytes per file
20 MB
Bytes per request
40 MB
Pixels per image
50,000,000
Pixels per request
100,000,000
Output pixels
50,000,000
Frames per animation
64
Pipeline steps
8
Images per extraction
500
Extracted bytes
64 MB

text/*

Bytes per file
2 MB
Bytes per request
4 MB
Inline dictionary terms
1,000
Bytes per term
256
Distinct tokens per request
5,000
Encoding
UTF-8 only

office/*

Bytes per file
50 MB
Bytes per request
60 MB
Conversion timeout
60s
Concurrent conversions
2

Everywhere

Bytes in the options object
64 KB
Job time budget
30s
Admission budget
1 GB
Requests per second, per account
10
Burst above that
20
Concurrent requests, per account
8

Why a big job is refused rather than queued

Admission is rationed by estimated memory, not by request count, so a lot of small jobs run concurrently while a few large ones do not. When the budget is exhausted you get 503 busy immediately, with Retry-After, rather than joining a queue that grows without bound and eats the deadline you were going to be charged for anyway.

Office conversions are bounded the same way and more tightly — two at a time, then 503 office_busy — because LibreOffice allocates its own memory out of sight of anything this service can measure, and a caller held behind a queue for most of their deadline would be charged for a timeout instead of told to retry.

Rate and concurrency

Credits bound what you can spend in total; they say nothing about the rate. The per-account limits in the last table are what stop one caller saturating the box while everyone else collects 503s — and those refusals cost that caller nothing, which is the gap the limits close. They are generous by design: they bound a runaway loop, not normal use. If your normal use is above them, tell us and we will raise them.

Limits are keyed on the account, not the key, so minting more keys does not multiply your share of the box.

Ask for a higher ceiling

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.