API Reference Private beta
PrivConvert API
A single REST endpoint for every conversion — images, documents, data, eBooks, fonts and archives. Files are processed entirely in memory and deleted the instant they are returned. Nothing is ever written to disk.
Introduction
The PrivConvert API turns any file conversion on PrivConvert into a single authenticated POST request. It is designed for teams that handle sensitive documents — legal, medical, finance — and cannot send files to a service that stores them.
https://privconvert.com/apiHTTPS only (TLS 1.3)Bearer API keymultipart/form-dataBinary file streamAuthentication
Every request must include your secret API key as a Bearer token in the Authorization header. Keys are issued per account and look like pk_live_…. Keep them server-side — never expose a key in client-side code.
# Pass your key in the Authorization header
Authorization: Bearer pk_live_xxxxxxxxxxxxxxxxxxxx Quick start
Convert a Word document to PDF. The converted file streams straight back in the response body.
# Convert contract.docx → PDF
curl -X POST https://privconvert.com/api/convert/word-to-pdf \
-H "Authorization: Bearer pk_live_…" \
-F "[email protected]" \
-o contract.pdf Convert a file
POST /api/convert/{tool}
The {tool} path segment selects the conversion — for example word-to-pdf, png-to-jpg or json-to-csv. Send the source file as a file field in a multipart/form-data body. The same pattern works for all 200+ tools.
Parameters
| Field | Type | Required | Description |
|---|---|---|---|
file | file | Yes | The source file to convert, sent as multipart form data. |
quality | integer | No | Output quality 1–100 for image/PDF tools. Defaults to 90. |
width | integer | No | Target width in pixels for resize-capable image tools. |
height | integer | No | Target height in pixels for resize-capable image tools. |
Response
On success (200) the response body is the converted file — a raw binary stream, not JSON. Read it from the body and write it to disk. Useful headers:
| Header | Example |
|---|---|
Content-Type | application/pdf |
Content-Disposition | attachment; filename="contract.pdf" |
X-Credits-Remaining | 4985 |
Errors return JSON instead of a file:
{
"error": {
"code": "file_too_large",
"message": "File exceeds the 100 MB limit on your plan."
}
} Code examples
The same request in your language of choice. Swap the png-to-jpg slug for any tool.
curl -X POST https://privconvert.com/api/convert/png-to-jpg \
-H "Authorization: Bearer pk_live_…" \
-F "[email protected]" \
-o photo.jpg import requests
with open("photo.png", "rb") as f:
r = requests.post(
"https://privconvert.com/api/convert/png-to-jpg",
headers={"Authorization": "Bearer pk_live_…"},
files={"file": f},
)
r.raise_for_status()
with open("photo.jpg", "wb") as out:
out.write(r.content) import { readFile, writeFile } from "node:fs/promises";
const form = new FormData();
form.append("file", new Blob([await readFile("photo.png")]), "photo.png");
const res = await fetch("https://privconvert.com/api/convert/png-to-jpg", {
method: "POST",
headers: { Authorization: "Bearer pk_live_…" },
body: form,
});
if (!res.ok) throw new Error("Conversion failed: " + res.status);
await writeFile("photo.jpg", Buffer.from(await res.arrayBuffer())); <?php
$ch = curl_init("https://privconvert.com/api/convert/png-to-jpg");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ["Authorization: Bearer pk_live_…"],
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => ["file" => new CURLFile("photo.png")],
]);
file_put_contents("photo.jpg", curl_exec($ch));
curl_close($ch); // Uses OkHttp
OkHttpClient client = new OkHttpClient();
RequestBody body = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("file", "photo.png",
RequestBody.create(new File("photo.png"), MediaType.parse("image/png")))
.build();
Request request = new Request.Builder()
.url("https://privconvert.com/api/convert/png-to-jpg")
.header("Authorization", "Bearer pk_live_…")
.post(body)
.build();
try (Response response = client.newCall(request).execute()) {
Files.write(Paths.get("photo.jpg"), response.body().bytes());
} using var client = new HttpClient();
using var form = new MultipartFormDataContent();
var file = new ByteArrayContent(await File.ReadAllBytesAsync("photo.png"));
file.Headers.ContentType = new MediaTypeHeaderValue("image/png");
form.Add(file, "file", "photo.png");
client.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", "pk_live_…");
var res = await client.PostAsync(
"https://privconvert.com/api/convert/png-to-jpg", form);
res.EnsureSuccessStatusCode();
await File.WriteAllBytesAsync("photo.jpg", await res.Content.ReadAsByteArrayAsync()); file, _ := os.Open("photo.png")
defer file.Close()
var body bytes.Buffer
w := multipart.NewWriter(&body)
part, _ := w.CreateFormFile("file", "photo.png")
io.Copy(part, file)
w.Close()
req, _ := http.NewRequest("POST",
"https://privconvert.com/api/convert/png-to-jpg", &body)
req.Header.Set("Authorization", "Bearer pk_live_…")
req.Header.Set("Content-Type", w.FormDataContentType())
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
out, _ := os.Create("photo.jpg")
io.Copy(out, res.Body) Available tools
Every server-side conversion uses the same /api/convert/{tool} pattern. A sample of the 200+ available slugs:
Images
png-to-jpgimage-to-webpheic-to-jpgcompress-imageresize-image Documents
word-to-pdfexcel-to-pdfpdf-to-wordhtml-to-pdfmarkdown-to-pdf Data
json-to-csvcsv-to-jsonxml-to-jsonyaml-to-jsonjson-to-sql eBooks
epub-to-mobipdf-to-epubmobi-to-epubazw3-to-epub Fonts & archives
ttf-to-woff2otf-to-woff2rar-to-zip7z-to-zip See the full tool catalog for every supported conversion. If a tool exists on the site, it works over the API with the same slug.
Rate limits & quotas
Quota is counted per successful conversion and resets on the first of each month. Beyond your rate limit or quota, requests return 429 with a Retry-After header.
| Plan | Monthly quota | Rate limit | Max file size |
|---|---|---|---|
| Starter | 5,000 / mo | 60 req / min | 100 MB |
| Growth | 25,000 / mo | 120 req / min | 250 MB |
| Scale | 150,000 / mo | 300 req / min | 250 MB |
| Enterprise | Custom | Custom | Custom |
Errors
The API uses conventional HTTP status codes. 2xx means success; 4xx means a problem with the request; 5xx means a problem on our side.
| Status | Code | Meaning |
|---|---|---|
200 | OK | Conversion succeeded. The body is the converted file. |
400 | bad_request | Malformed request — missing file, bad parameter, or unreadable input. |
401 | unauthorized | Missing or invalid API key. |
413 | file_too_large | The uploaded file exceeds your plan’s size limit. |
415 | unsupported_type | The input file type is not valid for this tool. |
422 | conversion_failed | The file was read but could not be converted. |
429 | rate_limited | Rate limit or monthly quota exceeded. See Retry-After. |
500 | server_error | Unexpected error on our side. Safe to retry. |
Privacy & data handling
Privacy is the product. Every file you send to the API is:
- Processed entirely in RAM — never written to disk.
- Deleted from memory the instant the converted file is returned.
- Never logged, never used for training, never shared.
- Covered by a signed DPA on Enterprise plans.
Request a beta key and we will get you converting in minutes.