VSDX to JPG API
Upload a VSDX to /v2/convert/vsdx/to/jpg and get one JPEG per drawing page on a white background. The sample sends ImageWidth=1200, so both Letter landscape pages come back 1200 × 927 instead of 1650 × 1275 at the default 150 DPI.
- Endpoint
- POST /v2/
convert/ vsdx/ to/ jpg - Accepts
- vsdx
- Sample timing
- 0.539 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/jpg \
-H "Authorization: Bearer $PDFCONVERSIONAPI_KEY" \
-F File=@bike-repair-workflow.vsdx \
--form-string ImageWidth=1200 \
-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/jpg",
headers={"Authorization": f"Bearer {key}"},
files=[("File", open("bike-repair-workflow.vsdx", "rb"))],
data={
"ImageWidth": "1200",
},
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);
form.append("ImageWidth", "1200");
const url = "https://api.pdfconversionapi.com/v2/convert/vsdx/to/jpg";
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.539,
"Files": [
{
"FileName": "bike-repair-workflow-1.jpg",
"FileExt": "jpg",
"FileSize": 90696,
"FileData": "/9j/4AAQSkZJRgABAgAAAQAB…"
},
{
"FileName": "bike-repair-workflow-2.jpg",
"FileExt": "jpg",
"FileSize": 77326,
"FileData": "/9j/4AAQSkZJRgABAgAAAQAB…"
}
]
}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-1.jpg (89 KB)bike-repair-workflow-2.jpg (76 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 |
|---|---|
ImageWidthinteger | Width of each JPEG in pixels, with the height kept in proportion. The sample's two pages at 1200 wide are 90,696 and 77,326 bytes.Values: 1–20000 |
ImageHeightinteger | Height in pixels. Sent with ImageWidth, each page is fitted inside both.Values: 1–20000 |
ImageResolutioninteger, default 150 | DPI to draw at when no size is given, recorded in the JPEG when you send it. ConvertAPI's default is 200.Values: 36–600 |
ImageQualityinteger, default 85 | JPEG quality. At the default 150 DPI the flowchart page is 148,782 bytes at 85 and 113,994 at 60. ConvertAPI's default is 75.Values: 1–100 |
PageRangestring | Which pages to convert; 1 gives only the flowchart, as bike-repair-workflow-1.jpg.Values: e.g. 1, 1-2, 2-last |
ColorSpaceenum, default default | gray writes one-channel JPEGs (96,986 bytes for page 1 at 150 DPI). cmyk returns 400.Values: default, rgb, gray, grayscale, monochrome |
ScaleProportionsboolean, default true | With false, ImageWidth and ImageHeight are both met exactly and the page is stretched. |
FileNamestring | Stem for the page files; each name ends in its page number. |
StoreFileboolean, default false | Links to the stored JPEGs, kept for 3 hours, in place of the data. |
Not supported yet
Setting one of these to anything but its default returns 400.
| Option | What to do instead |
|---|---|
PageSize | The page size saved in the drawing is used; PageSize=letter returns 400 "PageSize is not supported yet for VSDX files". |
Also refused when set: PageOrientation.
What carries over, and what doesn't
Kept
- One JPEG per page, drawn from the same vector page the PDF route produces, so text and lines are drawn sharp at the requested size
- Fills, line weights, dashed outlines and arrowheads as drawn in the file
- Embedded pictures, like the sample's badge
- Full-resolution color: no chroma subsampling (4:4:4), which keeps colored text and thin lines clean
Lost or not yet supported
- No transparency: JPEG has no alpha channel, and the page background is white.
- Text becomes pixels and can't be searched; hyperlinks and shape data are dropped.
- JPEG edges show some compression noise around text and thin lines; PNG avoids it.
- No DPI is written unless you send
ImageResolution; the sample's JPEGs have none. - In a drawing with pages of different sizes, every page takes the largest width and height.
Limits
- One VSDX per request, at most 2,000 pages drawn.
ImageWidthandImageHeightmust be 1 to 20,000,ImageResolution36 to 600 andImageQuality1 to 100.- A page over 16,000 pixels on a side or 100 million pixels returns 413.
- Requests up to 10 MB on the Free plan or 100 MB on paid plans, all files and fields together.
- Conversions are cut off at 120 seconds with a 504.
Where teams use it
Diagram previews in a document portal
A portal that stores Visio files can show a JPEG of each page next to the download, so people find the right process map without opening Visio.
Images for email and chat
Paste a page of the flowchart into an email or a chat thread. At ImageWidth=1200 each page is under 100 KB in the sample.
Questions
Can I get all pages in one JPEG?
No, each page is its own file, named with its page number. Use PDF if you need the pages together in one file.
What size do the JPEGs come out?
At 150 DPI unless you ask otherwise: 1650 × 1275 for a Letter landscape page. ImageWidth=1200 gives 1200 × 927, and ImageResolution=200, ConvertAPI's default DPI, gives 2200 × 1700.
Are the JPEGs drawn at full quality before shrinking?
They are drawn directly at the requested size, not drawn large and scaled down, so small sizes keep lines crisp and files small.
Convert your first VSDX file in a minute.