ODT to TIFF API
Send an .odt file to POST /v2/convert/odt/to/tiff and get one uncompressed TIFF for each page. The sample asks for page 1 at 72 DPI in grayscale and gets a 612 × 792 image of 484,902 bytes with its resolution tags set to 72.
- Endpoint
- POST /v2/
convert/ odt/ to/ tiff - Accepts
- odt
- Sample timing
- 38 ms median of 5 runsHow we measure
- Request size
- Up to 10 MB on the Free plan or 100 MB on paid plans, all files together
Request and response
Every sample below ran against the API before this page was published. Set PDFCONVERSIONAPI_KEY to your key and run it as is.
curl -sS -X POST \
https://api.pdfconversionapi.com/v2/convert/odt/to/tiff \
-H "Authorization: Bearer $PDFCONVERSIONAPI_KEY" \
-F File=@garden-plot-guide.odt \
--form-string PageRange=1 \
--form-string ImageResolution=72 \
--form-string ColorSpace=gray \
-o response.json
# FileData is base64. Save the first file in converted/,
# or print the JSON error.
if jq -e '.Files' response.json > /dev/null; then
mkdir -p converted
name=$(jq -r '.Files[0].FileName' response.json)
jq -r '.Files[0].FileData' response.json \
| base64 --decode > "converted/$name"
else
cat response.json
fiimport base64
import os
import requests
key = os.environ["PDFCONVERSIONAPI_KEY"]
response = requests.post(
"https://api.pdfconversionapi.com/v2/convert/odt/to/tiff",
headers={"Authorization": f"Bearer {key}"},
files=[("File", open("garden-plot-guide.odt", "rb"))],
data={
"PageRange": "1",
"ImageResolution": "72",
"ColorSpace": "gray",
},
timeout=180,
)
result = response.json()
if not response.ok:
raise SystemExit(f"{result['Code']}: {result['Message']}")
os.makedirs("converted", exist_ok=True)
for file in result["Files"]:
path = os.path.join("converted", file["FileName"])
with open(path, "wb") as out:
out.write(base64.b64decode(file["FileData"]))
print(path, file["FileSize"], "bytes")
import { mkdir, readFile, writeFile } from "node:fs/promises";
import { join } from "node:path";
const form = new FormData();
const file = "garden-plot-guide.odt";
form.append("File", new Blob([await readFile(file)]), file);
form.append("PageRange", "1");
form.append("ImageResolution", "72");
form.append("ColorSpace", "gray");
const url = "https://api.pdfconversionapi.com/v2/convert/odt/to/tiff";
const key = process.env.PDFCONVERSIONAPI_KEY;
const response = await fetch(url, {
method: "POST",
headers: { Authorization: `Bearer ${key}` },
body: form,
});
const result = await response.json();
if (!response.ok) {
throw new Error(`${result.Code}: ${result.Message}`);
}
await mkdir("converted", { recursive: true });
for (const file of result.Files) {
const path = join("converted", file.FileName);
await writeFile(path, Buffer.from(file.FileData, "base64"));
console.log(path, file.FileSize, "bytes");
}
{
"ConversionCost": 1,
"ConversionTime": 0.038,
"Files": [
{
"FileName": "garden-plot-guide-1.tiff",
"FileExt": "tiff",
"FileSize": 484902,
"FileData": "SUkqAHhlBwBIAAAAAQAAAEgA…"
}
]
}Response from our test run on 2026-11-03. ConversionTime shows the median of 5 runs. FileData is shortened here; the real response carries the whole file as base64.
The sample, converted
The same file the code sends. Download the input and the output and compare them yourself.

- Input
- garden-plot-guide.odt (35 KB)
- Output
- garden-plot-guide-1.tiff (474 KB)
- Source
- A two-page plot holder guide for a fictional community garden, with a fee table, a plot map, lists, a footnote and a page-numbered footer. We wrote it for these pages as an OpenDocument text file. (CC0-1.0). How it was made
- Made by
- 2026-11-04, API build
9eeeb0640aba
Parameters
Send these as form fields next to the file. Names are case-insensitive. If you set one of the documented options below that we don't support yet, the request fails with a 400 that names it instead of returning a file made without it.
| Parameter | What it does |
|---|---|
ImageResolutioninteger, default 150 | How finely each page is drawn, in dots per inch. When sent, it is also stored in the XResolution and YResolution tags with inches as the unit; when left out, those tags say 1 with no unit. At 150 a Letter page is 1,275 × 1,650 pixels, at 200 it is 1,700 × 2,200.Values: 36–600 |
ColorSpaceenum, default default | Pixel format of the TIFF. By default each pixel is 3 bytes of RGB. gray stores 1 byte per pixel, which cut the sample's page from 1,454,338 to 484,902 bytes at 72 DPI. monochrome also uses 1 byte per pixel but only black and white values. rgb gives the same file as the default. cmyk returns 400.Values: default, rgb, gray, monochrome |
PageRangestring | Choose pages, for example 1 as in the sample, 2 or 1-last. Each page is a separate TIFF named with its number, unless MultiPage=true joins them. |
MultiPageboolean, default false | true puts every page in one TIFF named after the document, garden-plot-guide.tiff, stored with lossless LZW compression: the sample's 2 pages at 72 DPI take 153,330 bytes in color and 90,654 in gray, where one uncompressed color page alone is 1,454,338. With a single page selected, as in PageRange=1, you still get the uncompressed garden-plot-guide-1.tiff. |
ImageWidthinteger | Scale each page to this many pixels across, keeping its shape.Values: 1–20000 |
ImageHeightinteger | Scale each page to this many pixels tall, or with ImageWidth, fit it inside both.Values: 1–20000 |
TransparentColorstring | Adds an alpha channel and makes every pixel of exactly this color transparent. white cleared 92.1% of page 1 at 72 DPI, and the uncompressed page grew from 1,454,338 to 1,939,046 bytes: 4 bytes per pixel instead of 3.Values: white, black, red, green, blue, gray, #RRGGBB or R,G,B |
BackgroundColorstring | Fill color under each page, visible in its margins and empty areas.Values: Same as TransparentColor |
FileNamestring | Stem of the page files: FileName=plots with PageRange=1 gives plots-1.tiff. |
StoreFileboolean, default false | Return links to the TIFFs, kept for 3 hours, instead of the data. Worth using for large pages, which make large responses. |
What carries over, and what doesn't
Kept
- The same page layout as the ODT to PDF route, one TIFF per page unless you send
MultiPage=true - Exact pixels: a single page is stored without compression and a
MultiPage=truefile with lossless LZW, so nothing is lost - The DPI you send, in the resolution tags with the unit set to inches
- Gray values for the colored parts when
ColorSpace=grayis sent: the green table header, the red warning and the map turn into shades of gray
Lost or not yet supported
- Small files, unless you join the pages with
MultiPage=true. Single pages are uncompressed: one Letter page in color is 6,311,516 bytes at the default 150 DPI and 11,220,306 bytes at 200 DPI. - The page numbers in the footer, which show the stored "page 2 of 2" on page 1, and the footnote, which is not read.
- The ODT's heading styles and table column widths: headings are drawn in dark blue Carlito instead of bold green, and the four table columns come out equal, as in the PDF.
- True 1-bit images:
monochromekeeps 8 bits per pixel with only the values 0 and 255.
Limits
- At most 2,000 pages per request and 16,000 pixels per side or 100 million pixels per page; above those the API returns 413.
- A password-protected ODT returns 422 without
Passwordand 400 "password-protected ODT files can't be converted to TIFF yet" with it. - Requests up to 10 MB on the Free plan or 100 MB on paid plans; 120 seconds per conversion before a 504. Color TIFFs are large, so a long document at high DPI makes a large response.
Where teams use it
Loading documents into imaging and records systems
When a document management or archiving system takes page images as TIFF, send ImageResolution so each file records its DPI, and ColorSpace=gray to cut the size to a third.
Input for OCR or image processing
An uncompressed TIFF needs no image codec to read, only a TIFF parser. Render at 200 DPI or more when another tool will run text recognition on the pages, and use StoreFile=true to keep the response small.
Questions
Why are the TIFF files so large?
They are stored without compression, as 3 bytes per pixel (red, green and blue) unless you ask for gray. A Letter page at 150 DPI is 1,275 × 1,650 pixels, so 6.3 million bytes. Lower ImageResolution, send ColorSpace=gray to divide the size by three, or send MultiPage=true: the sample's two pages then come back as one LZW-compressed file of 390,518 bytes at 150 DPI.
Can I get all pages in one multi-page TIFF?
Yes. Send MultiPage=true and the response holds one file, garden-plot-guide.tiff, with a page for each page of the document; it is LZW-compressed, so the sample's two color pages at 72 DPI take 153,330 bytes. Without it, which is our default for ODT input, every page comes back as its own uncompressed file (garden-plot-guide-1.tiff, garden-plot-guide-2.tiff).
Can I make a black-and-white TIFF for fax-style archives?
ColorSpace=monochrome turns every pixel black or white, but stores it in 8-bit grayscale, uncompressed or LZW with MultiPage=true, rather than as a 1-bit CCITT image. Systems that require Group 4 TIFF need a further conversion step on your side.
Convert your first ODT file in a minute.