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