# 1. Inspect remaining daily free quota and reset timestamp
curl -X GET "https://paperplane.qd.je/api/v1/account/usage" \
-H "Authorization: Bearer YOUR_PAPERPLANE_API_KEY"
# 2. Asynchronously submit a PDF compression job with idempotency
curl -X POST "https://paperplane.qd.je/api/v1/jobs" \
-H "Authorization: Bearer YOUR_PAPERPLANE_API_KEY" \
-H "Idempotency-Key: invoice_batch_98124" \
-F "operation=compress" \
-F "options={\"preset\":\"balanced\"}" \
-F "files=@document.pdf"
# Response (HTTP 202 Accepted):
# {"job_id":"4f9a8b1c...","operation":"compress","status":"queued","status_url":"/api/v1/jobs/4f9a8b1c...","download_url":"/api/v1/jobs/4f9a8b1c.../download"}
# 3. Poll job status
curl -X GET "https://paperplane.qd.je/api/v1/jobs/4f9a8b1c..." \
-H "Authorization: Bearer YOUR_PAPERPLANE_API_KEY"
# 4. Stream download verified output artifact
curl -O -J "https://paperplane.qd.je/api/v1/jobs/4f9a8b1c.../download" \
-H "Authorization: Bearer YOUR_PAPERPLANE_API_KEY"
import time
import requests
API_BASE = "https://paperplane.qd.je/api/v1"
HEADERS = {"Authorization": "Bearer YOUR_PAPERPLANE_API_KEY"}
# 1. Check account quota
usage = requests.get(f"{API_BASE}/account/usage", headers=HEADERS).json()
print(f"Remaining operations today: {usage['calls_remaining']}/{usage['daily_limit']}")
# 2. Submit conversion job (e.g. Word docx to PDF)
with open("annual_report.docx", "rb") as f:
resp = requests.post(
f"{API_BASE}/jobs",
headers={**HEADERS, "Idempotency-Key": "report_2026_q3"},
data={"operation": "word_to_pdf"},
files={"files": f}
)
resp.raise_for_status()
job_id = resp.json()["job_id"]
print(f"Job queued: {job_id}")
# 3. Poll status until completed
while True:
status_resp = requests.get(f"{API_BASE}/jobs/{job_id}", headers=HEADERS).json()
if status_resp["status"] == "completed":
print("Transform completed successfully!")
break
elif status_resp["status"] == "failed":
raise RuntimeError(f"Job failed: {status_resp.get('error')}")
time.sleep(0.5)
# 4. Download converted PDF
dl_resp = requests.get(f"{API_BASE}/jobs/{job_id}/download", headers=HEADERS)
dl_resp.raise_for_status()
with open("annual_report.pdf", "wb") as f:
f.write(dl_resp.content)
print("Saved converted PDF to annual_report.pdf")
import fs from 'node:fs';
import { Blob } from 'node:buffer';
const API_BASE = 'https://paperplane.qd.je/api/v1';
const API_KEY = process.env.PAPERPLANE_API_KEY || 'YOUR_PAPERPLANE_API_KEY';
const HEADERS = { 'Authorization': `Bearer ${API_KEY}` };
async function mergePdfs(pdfPaths) {
const form = new FormData();
form.append('operation', 'merge');
for (const p of pdfPaths) {
const fileBytes = fs.readFileSync(p);
form.append('files', new Blob([fileBytes], { type: 'application/pdf' }), p);
}
// 1. Submit merge job
const res = await fetch(`${API_BASE}/jobs`, {
method: 'POST',
headers: { ...HEADERS, 'Idempotency-Key': `merge_${Date.now()}` },
body: form,
});
if (!res.ok) throw new Error(`API error: ${res.statusText}`);
const { job_id } = await res.json();
console.log(`Merge job dispatched: ${job_id}`);
// 2. Poll job status
while (true) {
const poll = await fetch(`${API_BASE}/jobs/${job_id}`, { headers: HEADERS });
const info = await poll.json();
if (info.status === 'completed') break;
if (info.status === 'failed') throw new Error(info.error);
await new Promise(r => setTimeout(r, 500));
}
// 3. Download output
const dl = await fetch(`${API_BASE}/jobs/${job_id}/download`, { headers: HEADERS });
const buffer = Buffer.from(await dl.arrayBuffer());
fs.writeFileSync('merged_document.pdf', buffer);
console.log('Merged PDF saved to merged_document.pdf');
}
mergePdfs(['invoice_p1.pdf', 'invoice_p2.pdf']);
// In-Browser direct REST invocation
async function convertFileInBrowser(file, operation = 'compress') {
const API_KEY = 'YOUR_PAPERPLANE_API_KEY';
const form = new FormData();
form.append('operation', operation);
form.append('files', file);
const res = await fetch('/api/v1/jobs', {
method: 'POST',
headers: {
'Authorization': `Bearer ${API_KEY}`
},
body: form
});
if (!res.ok) {
const err = await res.json();
throw new Error(err.detail?.message || err.detail || 'Submission failed');
}
const { job_id } = await res.json();
// Poll status
let done = false;
while (!done) {
const statusRes = await fetch(`/api/v1/jobs/${job_id}`, {
headers: { 'Authorization': `Bearer ${API_KEY}` }
});
const data = await statusRes.json();
if (data.status === 'completed') {
window.location.href = `/api/v1/jobs/${job_id}/download`;
done = true;
} else if (data.status === 'failed') {
throw new Error(data.error);
}
await new Promise(r => setTimeout(r, 500));
}
}