PPT to WebP API
POST /v2/convert/ppt/to/webp returns a lossless WebP image of every visible slide in a .ppt. Sent with no options, the sample's 4:3 slides come back at 1,500 × 1,125 and weigh 247,552 bytes in total.
- Endpoint
- POST /v2/
convert/ ppt/ to/ webp - Accepts
- ppt
- Sample timing
- 0.624 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/ppt/to/webp \
-H "Authorization: Bearer $PDFCONVERSIONAPI_KEY" \
-F File=@eastgate-pantry-orientation.ppt \
-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/ppt/to/webp",
headers={"Authorization": f"Bearer {key}"},
files=[
("File", open("eastgate-pantry-orientation.ppt", "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 = "eastgate-pantry-orientation.ppt";
form.append("File", new Blob([await readFile(file)]), file);
const url = "https://api.pdfconversionapi.com/v2/convert/ppt/to/webp";
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.624,
"Files": [
{
"FileName": "eastgate-pantry-orientation-1.webp",
"FileExt": "webp",
"FileSize": 37066,
"FileData": "UklGRsKQAABXRUJQVlA4TLWQ…"
},
{
"FileName": "eastgate-pantry-orientation-2.webp",
"FileExt": "webp",
"FileSize": 72358,
"FileData": "UklGRp4aAQBXRUJQVlA4TJIa…"
},
{
"FileName": "eastgate-pantry-orientation-3.webp",
"FileExt": "webp",
"FileSize": 44786,
"FileData": "UklGRuquAABXRUJQVlA4TN6u…"
},
… 2 more files
]
}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
- eastgate-pantry-orientation.ppt (80 KB)
- Output
- eastgate-pantry-orientation-1.webp (36 KB)eastgate-pantry-orientation-2.webp (71 KB)eastgate-pantry-orientation-3.webp (44 KB)eastgate-pantry-orientation-4.webp (58 KB)eastgate-pantry-orientation-5.webp (33 KB)
- Source
- A six-slide volunteer orientation deck for a fictional food pantry, made by us and saved in the PowerPoint 97-2003 format; slide 5 is hidden and slide 3 has speaker notes. (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 | Drawing density in pixels per inch. It sets the pixel size only; WebP has nowhere to store a DPI. ConvertAPI documents 200 as its default; sent here, 200 gave 2,000 × 1,500 slides.Values: 36–600 |
ImageWidthinteger | Exact width in pixels, the height following the 4:3 slide. Use it rather than ImageResolution when the images go into a fixed-width layout.Values: 1–20000 |
ImageHeightinteger | Exact height in pixels, or a box together with ImageWidth.Values: 1–20000 |
PageRangestring | Visible slides to include, numbered from 1 and skipping hidden ones.Values: e.g. 1, 2-4 |
ConvertHiddenSlidesboolean, default false | true adds the slides PowerPoint hides in a show, such as the sample's budget note. |
TransparentColorstring | Clears every pixel of one exact color; WebP stores the transparency. |
Passwordstring | Accepted, but encrypted decks don't open yet: a password-protected copy of the sample returned 422 "the input file is password-protected" with its password. |
Not supported yet
Setting one of these to anything but its default returns 400.
| Option | What to do instead |
|---|---|
ImageQuality | Only lossless WebP is written. A value other than 75 returns 400 "ImageQuality is not supported yet for PPT → WebP". |
What carries over, and what doesn't
Kept
- Exact pixels: the files use WebP's lossless mode, so text, table rules and chart edges match the drawn slide
- Five images for the five visible slides, numbered by position
- Sharpness at any size, because the slides are drawn from vector shapes
- An alpha channel for
TransparentColor
Lost or not yet supported
- Size control by quality. Lossy WebP isn't available, and
ImageQualityis refused. - The deck's speaker notes; the sample's note on slide 3 is not in any image.
- Resolution metadata: whatever
ImageResolutionyou choose, the WebP records none. - Hidden slides, unless you ask for them.
Limits
- One .ppt per request, up to 10 MB on the Free plan or 100 MB on paid plans.
- Up to 2,000 slides drawn, each at most 16,000 pixels per side and 100 million pixels.
- 120 seconds per conversion; longer jobs end with 504.
- Password-protected .ppt files: 422 for now, even with
Password.
Where teams use it
Putting an old deck archive on the web
Publish the slides of a .ppt collection as images on your site, at less than half the transfer size of PNG and without the blur JPEG adds to text.
Storing slide renders for a search results page
If you keep one image per slide to show next to search hits, lossless WebP holds the same pixels as PNG in less space.
Questions
How much smaller is WebP than PNG for .ppt slides?
For the sample at 150 DPI: 247,552 bytes as WebP, 541,903 as PNG and 550,395 as JPEG at quality 85. The WebP files are lossless, so they are both the smallest and an exact copy of the drawn slide.
Which slide takes the most space?
The shift table, at 72,358 bytes, because of its many letters and cell borders. The title slide with its large flat band needs 37,066 bytes, and the floor-plan slide 33,686.
Can I get lossy WebP for smaller files?
Not on this route yet: ImageQuality returns 400. To shrink files, lower ImageResolution or set ImageWidth, or use /v2/convert/ppt/to/jpg with a quality setting.
What happens with a .pptx sent here?
It is refused with 422 "it could not be opened as PPT", because this route only reads the 97-2003 format. Send it to /v2/convert/pptx/to/webp instead.
Convert your first PPT file in a minute.