Skip to content

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)