VSDX to TIFF API
POST a VSDX to /v2/convert/vsdx/to/tiff and get a single multi-page TIFF holding every drawing page, compressed with LZW. For the two-page sample that is 206,838 bytes at the default 150 DPI.
- Endpoint
- POST /v2/
convert/ vsdx/ to/ tiff - Accepts
- vsdx
- Sample timing
- 0.634 s 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/vsdx/to/tiff \
-H "Authorization: Bearer $PDFCONVERSIONAPI_KEY" \
-F File=@bike-repair-workflow.vsdx \
-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/vsdx/to/tiff",
headers={"Authorization": f"Bearer {key}"},
files=[("File", open("bike-repair-workflow.vsdx", "rb"))],
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 = "bike-repair-workflow.vsdx";
form.append("File", new Blob([await readFile(file)]), file);
const url = "https://api.pdfconversionapi.com/v2/convert/vsdx/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.634,
"Files": [
{
"FileName": "bike-repair-workflow.tiff",
"FileExt": "tiff",
"FileSize": 206838,
"FileData": "SUkqABP1AQABAAAAAQAAAAEA…"
}
]
}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
- bike-repair-workflow.vsdx (7.8 KB)
- Output
- bike-repair-workflow.tiff (202 KB)
- Source
- A two-page Visio drawing for a fictional bike shop, a repair intake flowchart and a workshop floor layout, which we wrote by hand from the VSDX package format (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 |
|---|---|
MultiPageboolean, default true | true puts all pages in one LZW-compressed TIFF. false returns one TIFF per page, and those are not compressed: 6,311,516 bytes each for the sample's pages. |
ImageResolutioninteger, default 150 | DPI to draw the pages at. At 100 the pages are 1100 × 850 and the two-page TIFF is 122,476 bytes. The value is written into the TIFF when you send it.Values: 36–600 |
ImageWidthinteger | Draw each page to this many pixels wide instead.Values: 1–20000 |
ImageHeightinteger | Or this many pixels high; both together fit each page inside the box.Values: 1–20000 |
PageRangestring | Pages to include. One page, such as 2, gives a single uncompressed TIFF named bike-repair-workflow-2.tiff.Values: e.g. 2, 1-2, 2-last |
ColorSpaceenum, default default | gray stores each page as 8-bit gray: 109,474 bytes for the two-page TIFF. monochrome keeps only black and white in the same 8-bit gray pages (36,035 bytes), and rgb returns the same RGB file as the default. cmyk returns 400.Values: default, rgb, gray, grayscale, monochrome |
TransparentColorstring | One exact color made transparent; white removes the page background, and the pages are then stored with an alpha channel (338,692 bytes for the sample).Values: A color name, #RRGGBB or R,G,B |
FileNamestring | Name of the TIFF, bike-repair-workflow.tiff by default. |
StoreFileboolean, default false | Return a 3-hour link to the TIFF instead of its bytes. |
Not supported yet
Setting one of these to anything but its default returns 400.
| Option | What to do instead |
|---|---|
PageSize | The drawing's own page size is used; PageSize returns 400 "PageSize is not supported yet for VSDX files". |
Also refused when set: PageOrientation.
What carries over, and what doesn't
Kept
- All drawing pages in order in one TIFF, each page at the size saved in the file (1650 × 1275 at 150 DPI for Letter landscape)
- Lossless LZW compression in the multi-page file
- Shapes, fills, line weights, text and embedded pictures as the PDF route draws them
- Gray pages stay gray: with
ColorSpace=grayeach page is one 8-bit channel, 109,474 bytes for the sample against 206,838 in color - Color pages as 8-bit RGB, with no alpha channel unless
TransparentColorasks for one
Lost or not yet supported
- Single-page TIFFs are stored uncompressed.
MultiPage=false, or aPageRangewith one page, gives files of about 6.3 MB per Letter page at 150 DPI. - No CCITT fax compression or 1-bit black-and-white pages.
- Text is pixels, and hyperlinks and shape data are gone.
- Pages of different sizes are all drawn at the largest width and height.
Limits
- One VSDX per request; up to 2,000 pages drawn.
- Pages above 16,000 pixels on a side or 100 million pixels return 413.
ImageResolutionoutside 36–600 returns 400.- Requests up to 10 MB on the Free plan or 100 MB on paid plans, all files and fields together.
- 120 seconds per conversion; longer conversions return 504.
Where teams use it
Document systems that take TIFF
Records and imaging systems that file everything as TIFF can take the whole drawing as one multi-page image, one Visio page per TIFF page.
Review tools that load pages as TIFF
Some review and annotation tools open documents as multi-page TIFF images. Send the drawing at ImageResolution=200 or 300 to match the resolution the tool expects.
Questions
Why is one page so much bigger than the whole TIFF?
Only the combined multi-page TIFF is compressed (LZW). A single page is written raw: 1650 × 1275 pixels × 3 bytes is about 6.3 MB. Keep MultiPage at its default, or use PNG for single pages.
Which resolution do the pages have?
150 DPI unless you send ImageResolution; ConvertAPI's default is 200. The DPI is recorded in the TIFF only when you send it.
Can I get 1-bit black-and-white TIFF pages?
Not yet. ColorSpace=monochrome makes every pixel black or white, but the pages are stored as 8-bit gray with LZW (36,035 bytes for the sample), not as bilevel CCITT images.
Convert your first VSDX file in a minute.