ODP to JPG API
POST /v2/convert/odp/to/jpg returns a JPEG of every visible slide in an OpenDocument presentation. At ImageResolution=120 with ConvertAPI's default quality of 75, our composting workshop gave four 1,322 × 744 images of 58,884 to 84,652 bytes.
- Endpoint
- POST /v2/
convert/ odp/ to/ jpg - Accepts
- odp
- Sample timing
- 0.858 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/jpg \
-H "Authorization: Bearer $PDFCONVERSIONAPI_KEY" \
-F File=@compost-workshop.odp \
--form-string ImageResolution=120 \
--form-string ImageQuality=75 \
-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/jpg",
headers={"Authorization": f"Bearer {key}"},
files=[("File", open("compost-workshop.odp", "rb"))],
data={
"ImageResolution": "120",
"ImageQuality": "75",
},
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", "120");
form.append("ImageQuality", "75");
const url = "https://api.pdfconversionapi.com/v2/convert/odp/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.858,
"Files": [
{
"FileName": "compost-workshop-1.jpg",
"FileExt": "jpg",
"FileSize": 60764,
"FileData": "/9j/4AAQSkZJRgABAgEAeAB4…"
},
{
"FileName": "compost-workshop-2.jpg",
"FileExt": "jpg",
"FileSize": 84652,
"FileData": "/9j/4AAQSkZJRgABAgEAeAB4…"
},
{
"FileName": "compost-workshop-3.jpg",
"FileExt": "jpg",
"FileSize": 58884,
"FileData": "/9j/4AAQSkZJRgABAgEAeAB4…"
},
… 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.jpg (59 KB)compost-workshop-2.jpg (83 KB)compost-workshop-3.jpg (58 KB)compost-workshop-4.jpg (80 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 | Pixels per inch of slide. The 28 cm (11.02-inch) wide slides are 1,653 × 930 at 150 and 1,322 × 744 at 120; a value you send is stored in the JPEG.Values: 36–600 |
ImageQualityinteger, default 85 | JPEG quality. ConvertAPI documents 75 as its default for ODP, which is what the sample sends; ours is 85. The title slide at 150 DPI is 97,508 bytes at 85 and 74,910 at 60.Values: 1–100 |
ImageWidthinteger | Exact width; the height keeps the 16:9 shape.Values: 1–20,000 |
ImageHeightinteger | Exact height; the width keeps the shape.Values: 1–20,000 |
PageRangestring | Which visible slides: 2 is the greens-and-browns table.Values: e.g. 2, 3-4 |
ConvertHiddenSlidesboolean, default false | Also render the hidden facilitator checklist, as image 4 of 5. |
ColorSpaceenum, default default | gray for one-channel JPEGs.Values: default, rgb, gray, monochrome |
Passwordstring | For a password-protected .odp; 422 without it. |
FileNamestring | Stem of the image names, followed by -1.jpg to -4.jpg. |
Not supported yet
Setting one of these to anything but its default returns 400.
| Option | What to do instead |
|---|---|
ConvertSpeakerNotes | Notes are not drawn. Any value but Disabled returns 400 "ConvertSpeakerNotes is not supported yet for ODP files". |
PageSize | Images keep the slide's shape; PageSize returns 400. |
What carries over, and what doesn't
Kept
- The cycle diagram's colored boxes, arrows and their soft shadows
- Table header colors: green for greens, brown for browns
- The cream background of the title slide
- Liberation Sans as designed, since the server has the font
Lost or not yet supported
- Sharp text: JPEG leaves faint noise around letters. PNG keeps them clean.
- The speaker note on the diagram slide.
- The hidden facilitator slide, by default.
Limits
- At most 2,000 images per request.
- 16,000 pixels per side and 100 million pixels per image; 413 above that.
- 10 MB on the Free plan or 100 MB on paid plans per request, 120 seconds per conversion.
Where teams use it
Workshop slides in a newsletter or on a notice board site
Post the greens-and-browns table or the cycle diagram as pictures where attachments don't work. PageRange picks single slides.
Course pages that only take images
Learning platforms and forums that accept pictures but not presentations can show each slide as a JPEG; at 120 DPI and quality 75, as in the sample, the four workshop slides total 285,730 bytes.
Questions
Why are the images 1,653 pixels wide by default?
OpenDocument slides here are 28 cm wide, which is 11.02 inches. At the default 150 pixels per inch that comes to 1,653 × 930. Set ImageWidth when you need a round number.
How do I match ConvertAPI's JPEG output settings?
Send ImageQuality=75 and ImageResolution=200, the defaults ConvertAPI documents for ODP to JPG. Ours are 85 and 150. At 200 our slides are 2,204 × 1,240 pixels.
Is the DPI stored in the file?
When you send ImageResolution, yes: the sample's JPEGs say 120 DPI. Without it the header has no DPI.
Convert your first ODP file in a minute.