ODP to WebP API
POST /v2/convert/odp/to/webp turns each visible slide of an OpenDocument presentation into a lossless WebP. At ImageResolution=96 our composting workshop came back as four 1,058 × 595 images totaling 195,520 bytes.
- Endpoint
- POST /v2/
convert/ odp/ to/ webp - Accepts
- odp
- Sample timing
- 0.791 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/odp/to/webp \
-H "Authorization: Bearer $PDFCONVERSIONAPI_KEY" \
-F File=@compost-workshop.odp \
--form-string ImageResolution=96 \
-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/odp/to/webp",
headers={"Authorization": f"Bearer {key}"},
files=[("File", open("compost-workshop.odp", "rb"))],
data={
"ImageResolution": "96",
},
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 = "compost-workshop.odp";
form.append("File", new Blob([await readFile(file)]), file);
form.append("ImageResolution", "96");
const url = "https://api.pdfconversionapi.com/v2/convert/odp/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.791,
"Files": [
{
"FileName": "compost-workshop-1.webp",
"FileExt": "webp",
"FileSize": 44338,
"FileData": "UklGRiqtAABXRUJQVlA4TB2t…"
},
{
"FileName": "compost-workshop-2.webp",
"FileExt": "webp",
"FileSize": 65784,
"FileData": "UklGRvAAAQBXRUJQVlA4TOQA…"
},
{
"FileName": "compost-workshop-3.webp",
"FileExt": "webp",
"FileSize": 32870,
"FileData": "UklGRl6AAABXRUJQVlA4TFKA…"
},
… 1 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
- compost-workshop.odp (40 KB)
- Output
- compost-workshop-1.webp (43 KB)compost-workshop-2.webp (64 KB)compost-workshop-3.webp (32 KB)compost-workshop-4.webp (51 KB)
- Source
- Five OpenDocument slides for a composting workshop at a fictional community garden, with a table, a diagram drawn from shapes and one hidden slide. We made them for this page. (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 | Pixel density: 1,653 × 930 at the default, 1,058 × 595 at 96. WebP keeps no DPI, so only the size changes.Values: 36–600 |
ImageWidthinteger | Exact width, height following the 16:9 slide.Values: 1–20,000 |
ImageHeightinteger | Exact height, width following.Values: 1–20,000 |
PageRangestring | Slides to convert, hidden ones not counted: 1,3 for the title and the diagram.Values: e.g. 1,3 |
ConvertHiddenSlidesboolean, default false | Also convert the hidden facilitator slide. |
TransparentColorstring | Turns one exact color transparent, for example white. |
Passwordstring | Opens a password-protected .odp. |
FileNamestring | Base of the names, numbered -1.webp onward. |
Not supported yet
Setting one of these to anything but its default returns 400.
| Option | What to do instead |
|---|---|
ConvertSpeakerNotes | Notes are not drawn. Values other than Disabled return 400. |
PageSize | Images take the slide's shape; size them with ImageWidth or ImageHeight instead. |
What carries over, and what doesn't
Kept
- Lossless pixels: the same image the PNG route draws
- The diagram's soft shadows and the cream title background
- Three color channels and no alpha, until
TransparentColoradds one - Liberation Sans text exactly as laid out in the file
Lost or not yet supported
- Lossy savings: there is no quality setting.
- A DPI value, which WebP has no field for.
- The diagram slide's note and, by default, the hidden checklist.
Limits
- 2,000 images per request at most.
- 16,000 pixels per side and 100 million pixels per image.
- 10 MB on the Free plan or 100 MB on paid plans per request; 120 seconds per conversion.
Where teams use it
Event pages for a talk or workshop
Put every slide of the session on the event page. The four lossless images at 96 DPI total 195,520 bytes and keep the table text crisp.
Previews in a shared drive or CMS
Show a picture of each .odp a group uploads, so members can find the right deck without opening an office suite.
Questions
Does ImageQuality make the files smaller?
No. ODP to WebP always writes lossless files, and ImageQuality=60 came back byte for byte the same as the default. Since ConvertAPI doesn't list the option for this pair, the API ignores it instead of refusing it. For lossy images use /v2/convert/odp/to/jpg.
How big are the images at the default resolution?
At 1,653 × 930 the four slides are 53,114 to 106,142 bytes; the table slide is the largest. At 96 DPI they shrink to 32,870 to 65,784 bytes.
Which slides are included?
Only slides that are shown in a presentation: 4 of the 5 here. The facilitator checklist is hidden in the file and needs ConvertHiddenSlides=true.
Convert your first ODP file in a minute.