TIFF to TIFF API
POST a TIFF to /v2/convert/tiff/to/tiff and get its first page back as a simple, uncompressed TIFF. Use it to resize, to turn the page gray or black and white, or to record a DPI; the sample does both of the last two.
- Endpoint
- POST /v2/
convert/ tiff/ to/ tiff - Accepts
- tiff
- Sample timing
- 2 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/tiff/to/tiff \
-H "Authorization: Bearer $PDFCONVERSIONAPI_KEY" \
-F File=@bin-label-c14.tiff \
--form-string ColorSpace=gray \
--form-string ImageResolution=200 \
-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/tiff/to/tiff",
headers={"Authorization": f"Bearer {key}"},
files=[("File", open("bin-label-c14.tiff", "rb"))],
data={
"ColorSpace": "gray",
"ImageResolution": "200",
},
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 = "bin-label-c14.tiff";
form.append("File", new Blob([await readFile(file)]), file);
form.append("ColorSpace", "gray");
form.append("ImageResolution", "200");
const url = "https://api.pdfconversionapi.com/v2/convert/tiff/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.002,
"Files": [
{
"FileName": "bin-label-c14.tiff",
"FileExt": "tiff",
"FileSize": 120198,
"FileData": "SUkqANjUAQDIAAAAAQAAAMgA…"
}
]
}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
- bin-label-c14.tiff (42 KB)
- Output
- bin-label-c14.tiff (117 KB)
- Source
- A two-page warehouse bin label and cycle-count sheet we drew for this page, saved as an LZW-compressed TIFF at 200 dpi. (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 |
|---|---|
ColorSpaceenum, default default | gray, as in the sample, writes one 8-bit channel (photometric min-is-black), cutting the label to 120,198 bytes. monochrome writes the same layout with only 0 and 255. A TIFF with alpha keeps it: the output stays RGBA with gray values, as a 120 × 80 RGBA test file did at 38,614 bytes. cmyk returns 400.Values: default, rgb, gray, monochrome |
ImageResolutioninteger | Written into the resolution tags with the unit inch. Without it the output says 1 × 1 with no unit, whatever the input declared.Values: 10–800 |
ImageWidthinteger | New width; 200 gave a 200 × 150 TIFF of 90,210 bytes.Values: 1–20000 |
ImageHeightinteger | New height, or with ImageWidth a box the page must fit.Values: 1–20000 |
ScaleProportionsboolean, default true | false resizes to the exact box even if the page gets distorted. |
ScaleIfLargerboolean, default false | true limits resizing to pages bigger than the box. |
ScaleImageboolean, default true | false crops the box out of the top-left corner without resampling. |
TransparentColorstring | Makes one exact color transparent and the TIFF RGBA: the label's paper gave 51,575 transparent pixels and 480,214 bytes.Values: Color name, #RRGGBB or R,G,B |
MultiPageboolean, default true | Accepted with either value. The input's first page is the only one converted, so there is nothing to combine. |
ImageInterpolationboolean, default false | Accepted; scaling always uses the Lanczos filter. |
FileNamestring | Output name. The result keeps the input's name, bin-label-c14.tiff, unless you set one. |
StoreFileboolean, default false | true stores the result for 3 hours and returns Files[].Url. |
Not supported yet
Setting one of these to anything but its default returns 400.
| Option | What to do instead |
|---|---|
ImageQuality | Any value but 75, ConvertAPI's default, returns 400 'ImageQuality is not supported yet for TIFF → TIFF'. Output is never JPEG-compressed. |
What carries over, and what doesn't
Kept
- The page's pixels: a default conversion has the same RGB values as page 1, and the gray sample uses one 8-bit channel.
- The DPI you ask for: the sample's tags read 200 × 200 pixels per inch.
- 16 bits per sample: a 16-bit gray TIFF was written back as 16-bit gray.
- The page size, 400 × 300.
- The Orientation tag's effect: a 300 × 200 TIFF tagged 6 was rewritten as an upright 200 × 300 page, with no Orientation tag left to apply twice.
Lost or not yet supported
- Every page after the first. The input had two pages; the output has one directory.
- Compression. The output is always uncompressed: the 42,928-byte LZW input became 360,210 bytes in RGB and 120,198 in gray.
- The input's own DPI, unless you send it again with
ImageResolution. - CMYK, which becomes RGB, plus ICC profiles and any tags beyond the basic image description.
- A labeled alpha channel. RGBA output has 4 samples but no ExtraSamples tag, so strict TIFF tools warn; three other readers we tried still treated it as transparency.
Limits
- One TIFF per request, and only its first page is read.
- Requests up to 10 MB on the Free plan or 100 MB on paid plans, all files and fields together.
- 100,000,000 pixels per page; larger pages return 413.
- Palette TIFFs return 422.
- 120 seconds per conversion, then 504.
Where teams use it
Normalizing TIFFs for older readers
TIFF allows many compressions and color models. Files that arrive as JPEG-in-TIFF, Group 4 fax, Deflate or CMYK can be rewritten as plain uncompressed RGB or gray that minimal TIFF readers handle.
Gray archive copies at a stated DPI
A scan of a text page doesn't need three color channels. ColorSpace=gray with ImageResolution gives a one-channel TIFF that says how large it should print, as in the sample.
Resizing without changing format
Make smaller TIFF copies for a viewer or a thumbnail column while the pipeline downstream keeps reading TIFF.
Questions
Can I compress the output with LZW, Deflate or JPEG?
No. Output TIFFs are always uncompressed, and ImageQuality other than 75 returns 400. For a smaller lossless copy, convert to PNG or WebP instead: the label was 31,866 bytes as PNG and 20,700 as WebP.
Does this merge or keep all pages?
No. Only the first page is read, and MultiPage has nothing to combine. The two-page sample came back as a one-page TIFF.
Why does my output say 1 dpi?
Without ImageResolution, the resolution tags are written as 1 × 1 with no unit. Send the value you want, such as 200 or 300, and the unit is set to inches.
Does the output keep 16-bit data?
Yes for the depth we tested: a 16-bit grayscale TIFF came back 16-bit. Gray and RGB pages keep their channel count unless you change ColorSpace.
Convert your first TIFF file in a minute.