Examples¶
Basic dewarp¶
curl -s https://page-dewarp-api.louismmx.workers.dev/api/dewarp \
-H "Authorization: Bearer pdw_YOUR_API_KEY" \
-F "file=@book-page.jpg" \
--output dewarped.png
TIFF output with custom parameters¶
curl -s https://page-dewarp-api.louismmx.workers.dev/api/dewarp \
-H "Authorization: Bearer pdw_YOUR_API_KEY" \
-H 'X-Dewarp-Params: {"output_format": "tiff", "focal_length": 1.5, "output_zoom": 2.0}' \
-F "file=@newspaper.tif" \
--output dewarped.tiff
Get dewarp parameters as JSON¶
curl -s https://page-dewarp-api.louismmx.workers.dev/api/dewarp \
-H "Authorization: Bearer pdw_YOUR_API_KEY" \
-H 'X-Dewarp-Include: result' \
-F "file=@page.jpg" \
-D headers.txt --output dewarped.png
# Extract and decode the parameters
grep x-dewarp-result headers.txt | cut -d' ' -f2 | tr -d '\r' | base64 -d | jq .
Get full diagnostic output¶
curl -s https://page-dewarp-api.louismmx.workers.dev/api/dewarp \
-H "Authorization: Bearer pdw_YOUR_API_KEY" \
-H 'X-Dewarp-Include: result,stdout,stderr' \
-F "file=@page.jpg" \
-D headers.txt --output dewarped.png
# Dewarp parameters
grep x-dewarp-result headers.txt | cut -d' ' -f2 | tr -d '\r' | base64 -d | jq .
# Processing log (config, timing, optimisation stats)
grep x-dewarp-stdout headers.txt | cut -d' ' -f2 | tr -d '\r' | base64 -d
Binary threshold output¶
By default the API returns grayscale. For traditional black-and-white:
curl -s https://page-dewarp-api.louismmx.workers.dev/api/dewarp \
-H "Authorization: Bearer pdw_YOUR_API_KEY" \
-H 'X-Dewarp-Params: {"no_binary": "0"}' \
-F "file=@page.jpg" \
--output dewarped-bw.png
Python¶
import requests
import base64
import json
API = "https://page-dewarp-api.louismmx.workers.dev"
KEY = "pdw_YOUR_API_KEY"
headers = {
"Authorization": f"Bearer {KEY}",
"X-Dewarp-Params": json.dumps({"output_format": "png", "focal_length": 1.2}),
"X-Dewarp-Include": "result",
}
with open("page.jpg", "rb") as f:
resp = requests.post(f"{API}/api/dewarp", headers=headers, files={"file": f})
resp.raise_for_status()
# Save the image
with open("dewarped.png", "wb") as f:
f.write(resp.content)
# Read the dewarp parameters
params_b64 = resp.headers.get("X-Dewarp-Result", "")
if params_b64:
params = json.loads(base64.b64decode(params_b64))
print(f"Rotation: {params['rotation_vector']}")
print(f"Page dims: {params['page_dims']}")
print(f"Credits remaining: {resp.headers['X-Credits-Remaining']}")
Batch processing (shell)¶
API_KEY="pdw_YOUR_API_KEY"
INPUT_DIR="./scanned-pages"
OUTPUT_DIR="./dewarped"
mkdir -p "$OUTPUT_DIR"
for img in "$INPUT_DIR"/*.jpg; do
name=$(basename "$img" .jpg)
echo "Processing $name..."
curl -s https://page-dewarp-api.louismmx.workers.dev/api/dewarp \
-H "Authorization: Bearer $API_KEY" \
-F "file=@$img" \
--output "$OUTPUT_DIR/$name.png"
done
Check credits before processing¶
credits=$(curl -s https://page-dewarp-api.louismmx.workers.dev/api/credits \
-H "Authorization: Bearer pdw_YOUR_API_KEY" | jq .credits)
echo "You have $credits credits"
if [ "$credits" -lt 1 ]; then
echo "Buy more credits first"
exit 1
fi
Error handling (Python)¶
resp = requests.post(f"{API}/api/dewarp", headers=headers, files={"file": f})
if resp.status_code == 401:
print("Invalid API key")
elif resp.status_code == 402:
remaining = resp.json().get("balance", 0)
print(f"Insufficient credits ({remaining} remaining)")
elif resp.status_code == 422:
detail = resp.json().get("detail", "Unknown error")
print(f"Processing failed: {detail}")
elif resp.status_code == 502:
print("Service temporarily unavailable — retry in a few seconds")
elif resp.ok:
with open("output.png", "wb") as f:
f.write(resp.content)