API Documentation

Everything you need to integrate the PixSqueeze batch compression API. All endpoints live under https://pixsqueeze-api-production.up.railway.app.

Authentication

Create an account to get an API key, then pass it as a Bearer token in every request: Authorization: Bearer psx_.... You can also sign up on this site and find your key in the dashboard.

POST /auth/register

curl -X POST https://pixsqueeze-api-production.up.railway.app/auth/register \
  -H "Content-Type: application/json" \
  -d '{"email":"you@example.com"}'

Response:

{
  "apiKey": "psx_...",
  "plan": "FREE",
  "monthlyLimit": 100,
  "message": "Account created. Keep your API key safe — it will not be shown again."
}

Your key is shown only once. Registering an existing email returns 409 — it never reveals the existing key.

POST /auth/rotate-key

Lost or leaked your key? Rotate it using your current key. The old key is revoked immediately.

curl -X POST https://pixsqueeze-api-production.up.railway.app/auth/rotate-key \
  -H "Authorization: Bearer psx_YOUR_CURRENT_KEY"

Compress images

POST /compress/batch

Send images as multipart form data. Compressed results are returned as base64-encoded files in a single JSON response.

curl -X POST https://pixsqueeze-api-production.up.railway.app/compress/batch \
  -H "Authorization: Bearer psx_YOUR_API_KEY" \
  -F "files=@photo1.jpg" \
  -F "files=@photo2.heic" \
  -F "quality=0.7" \
  -F "maxWidth=1280"

Form fields

filesfile · requiredOne or more image files (multipart). Repeat the field for each file. JPEG, PNG, WebP, GIF, HEIC, TIFF and camera RAW are accepted (RAW is compressed from its embedded full-resolution preview).
qualitynumberCompression quality between 0.1 and 1. Default 0.8.
maxWidthnumberResize images wider than this to fit. Aspect ratio is preserved.
maxHeightnumberResize images taller than this to fit. Aspect ratio is preserved.
mimeTypestringOutput format: image/jpeg (default), image/png, or image/webp.

Response:

{
  "processed": 2,
  "failed": 0,
  "results": [
    { "name": "photo1.jpg", "originalName": "photo1.jpg",  "size": 84213, "mimeType": "image/jpeg", "data": "base64..." },
    { "name": "photo2.jpg", "originalName": "photo2.heic", "size": 91067, "mimeType": "image/jpeg", "data": "base64..." }
  ],
  "usage": { "used": 2, "limit": 100, "remaining": 98, "plan": "FREE" }
}

Supported input formats: JPEG, PNG, WebP, GIF, HEIC/HEIF, TIFF, and camera RAW (CR2, NEF, ARW, DNG, and more).

Check usage

GET /usage

curl https://pixsqueeze-api-production.up.railway.app/usage \
  -H "Authorization: Bearer psx_YOUR_API_KEY"

Response:

{
  "plan": "FREE",
  "used": 3,
  "limit": 100,
  "remaining": 97,
  "resetDate": "2026-07-01"
}

Billing

Plans are managed from the dashboard, which uses these endpoints under the hood:

  • POST /billing/checkout — start a Stripe Checkout session for a plan upgrade
  • POST /billing/portal — open the Stripe customer portal

Errors

401Missing or invalid API key.
409An account with this email already exists. Keys are shown only once; rotate via /auth/rotate-key.
413Request body too large.
422Unsupported or unreadable image file.
429Monthly image limit reached. Upgrade your plan or wait for the reset date.
500Unexpected server error — retry with exponential backoff.

Ready to try it?

100 free images per month. No credit card required.