API Quickstart

Convert your first image in under 30 seconds. No signup required.

1

Get your API key (optional)

You can use the API without a key (10 requests/min, 50/day) or sign up free for higher limits (30/min, 500/day).

To get a key:

  1. Create an account at /account/signup/
  2. Go to Dashboard → API Keys
  3. Click Generate Key — your key starts with kp_

Step 2 works without a key — don't let this block you.

2

Convert your first image

The easiest way: convert from a URL. We provide a sample image so this works out of the box.

Option A — Convert from URL (easiest)

# Convert a sample image to WebP
curl -X POST https://koalapic.com/api/v1/convert/url \
  -H "Content-Type: application/json" \
  -d '{"url": "https://koalapic.com/static/sample.jpg", "output_format": "webp"}'
import requests

resp = requests.post("https://koalapic.com/api/v1/convert/url", json={
    "url": "https://koalapic.com/static/sample.jpg",
    "output_format": "webp",
})
conversion = resp.json()
print(f"Converting... ID: {conversion['id']}")
const resp = await fetch("https://koalapic.com/api/v1/convert/url", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    url: "https://koalapic.com/static/sample.jpg",
    output_format: "webp",
  }),
});
const conversion = await resp.json();
$response = file_get_contents('https://koalapic.com/api/v1/convert/url', false,
    stream_context_create(['http' => [
        'method'  => 'POST',
        'header'  => "Content-Type: application/json\r\n",
        'content' => json_encode([
            'url'           => 'https://koalapic.com/static/sample.jpg',
            'output_format' => 'webp',
        ]),
    ]])
);
$conversion = json_decode($response, true);

Option B — Convert a local file

curl -X POST https://koalapic.com/api/v1/convert \
  -F "file=@photo.jpg" \
  -F "output_format=webp"
with open("photo.jpg", "rb") as f:
    resp = requests.post("https://koalapic.com/api/v1/convert",
        files={"file": f},
        data={"output_format": "webp"},
    )
conversion = resp.json()
const formData = new FormData();
formData.append("file", fileInput.files[0]);
formData.append("output_format", "webp");

const resp = await fetch("https://koalapic.com/api/v1/convert", {
  method: "POST",
  body: formData,
});
const conversion = await resp.json();
$ch = curl_init('https://koalapic.com/api/v1/convert');
curl_setopt_array($ch, [
    CURLOPT_POST           => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POSTFIELDS     => [
        'file'          => new CURLFile('photo.jpg'),
        'output_format' => 'webp',
    ],
]);
$conversion = json_decode(curl_exec($ch), true);
curl_close($ch);

Response:

"id": "550e8400-e29b-41d4-a716-446655440000",
"status": "pending",
"output_format": "webp"

Save the id — you'll need it to check status and download.

3

Check conversion status

Poll the status endpoint until status is completed.

curl https://koalapic.com/api/v1/convert/CONVERSION_ID/status
import time

while True:
    status = requests.get(
        f"https://koalapic.com/api/v1/convert/{conversion['id']}/status"
    ).json()
    if status["status"] == "completed":
        break
    if status["status"] == "failed":
        print(f"Error: {status.get('error_message')}")
        exit(1)
    time.sleep(1)
let status;
do {
  await new Promise(r => setTimeout(r, 1000));
  const poll = await fetch(
    `https://koalapic.com/api/v1/convert/${conversion.id}/status`
  );
  status = await poll.json();
} while (status.status === "pending" || status.status === "processing");
do {
    sleep(1);
    $status = json_decode(file_get_contents(
        'https://koalapic.com/api/v1/convert/' . $conversion['id'] . '/status'
    ), true);
} while (in_array($status['status'], ['pending', 'processing']));

Response when completed:

{
  "status": "completed",
  "download_url": "/api/v1/download/abc123...",
  "download_token": "abc123...",
  "output_size": 45230,
  "input_size": 102400
}

When status is completed, your file is ready.

4

Download the result

curl -O https://koalapic.com/api/v1/download/DOWNLOAD_TOKEN
result = requests.get(f"https://koalapic.com{status['download_url']}")
with open("output.webp", "wb") as f:
    f.write(result.content)
print(f"Done! Saved output.webp ({len(result.content):,} bytes)")
if (status.status === "completed") {
  const file = await fetch(`https://koalapic.com${status.download_url}`);
  const blob = await file.blob();
  console.log(`Done! Size: ${blob.size} bytes`);
}
if ($status['status'] === 'completed') {
    $file = file_get_contents('https://koalapic.com' . $status['download_url']);
    file_put_contents('output.webp', $file);
    echo "Done! Saved output.webp (" . strlen($file) . " bytes)\n";
}

That's it! You've converted your first image via the API.

5

Next steps

Higher rate limits (30/min vs 10/min), usage tracking, and webhook support. Sign up freeManage keys

Convert up to 50 images at once with POST /api/v1/convert/url/batch. See batch docs

Use SSE (Server-Sent Events) instead of polling for instant progress updates. See SSE docs

Get notified when conversions complete via HMAC-signed webhook callbacks. See webhook docs

Compress images with smart quality (POST /api/v1/compress) or resize by percentage, pixels, or preset. Full API reference

Ready for the full reference?

Complete examples

Copy-paste a full working script for Steps 2–4 combined:

import requests
import time

# Step 2: Start conversion
resp = requests.post("https://koalapic.com/api/v1/convert/url", json={
    "url": "https://koalapic.com/static/sample.jpg",
    "output_format": "webp",
})
conversion = resp.json()
print(f"Converting... ID: {conversion['id']}")

# Step 3: Wait for completion
while True:
    status = requests.get(
        f"https://koalapic.com/api/v1/convert/{conversion['id']}/status"
    ).json()
    if status["status"] == "completed":
        break
    if status["status"] == "failed":
        print(f"Error: {status.get('error_message')}")
        exit(1)
    time.sleep(1)

# Step 4: Download
result = requests.get(f"https://koalapic.com{status['download_url']}")
with open("output.webp", "wb") as f:
    f.write(result.content)
print(f"Done! Saved output.webp ({len(result.content):,} bytes)")
// Step 2: Start conversion
const resp = await fetch("https://koalapic.com/api/v1/convert/url", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    url: "https://koalapic.com/static/sample.jpg",
    output_format: "webp",
  }),
});
const conversion = await resp.json();

// Step 3: Poll until done
let status;
do {
  await new Promise(r => setTimeout(r, 1000));
  const poll = await fetch(
    `https://koalapic.com/api/v1/convert/${conversion.id}/status`
  );
  status = await poll.json();
} while (status.status === "pending" || status.status === "processing");

// Step 4: Download
if (status.status === "completed") {
  const file = await fetch(`https://koalapic.com${status.download_url}`);
  const blob = await file.blob();
  console.log(`Done! Size: ${blob.size} bytes`);
}
#!/bin/bash
# Complete KoalaPic API conversion example

# Step 2: Start conversion
RESPONSE=$(curl -s -X POST https://koalapic.com/api/v1/convert/url \
  -H "Content-Type: application/json" \
  -d '{"url": "https://koalapic.com/static/sample.jpg", "output_format": "webp"}')

ID=$(echo $RESPONSE | python3 -c "import sys,json; print(json.load(sys.stdin)['id'])")
echo "Converting... ID: $ID"

# Step 3: Poll until done
while true; do
  STATUS=$(curl -s https://koalapic.com/api/v1/convert/$ID/status)
  STATE=$(echo $STATUS | python3 -c "import sys,json; print(json.load(sys.stdin)['status'])")
  [ "$STATE" = "completed" ] && break
  [ "$STATE" = "failed" ] && echo "Failed!" && exit 1
  sleep 1
done

# Step 4: Download
TOKEN=$(echo $STATUS | python3 -c "import sys,json; print(json.load(sys.stdin)['download_token'])")
curl -O https://koalapic.com/api/v1/download/$TOKEN
echo "Done!"
<?php
// Complete KoalaPic API conversion example

// Step 2: Start conversion
$response = file_get_contents('https://koalapic.com/api/v1/convert/url', false,
    stream_context_create(['http' => [
        'method'  => 'POST',
        'header'  => "Content-Type: application/json\r\n",
        'content' => json_encode([
            'url'           => 'https://koalapic.com/static/sample.jpg',
            'output_format' => 'webp',
        ]),
    ]])
);
$conversion = json_decode($response, true);
echo "Converting... ID: " . $conversion['id'] . "\n";

// Step 3: Poll until done
do {
    sleep(1);
    $status = json_decode(file_get_contents(
        'https://koalapic.com/api/v1/convert/' . $conversion['id'] . '/status'
    ), true);
} while (in_array($status['status'], ['pending', 'processing']));

// Step 4: Download
if ($status['status'] === 'completed') {
    $file = file_get_contents('https://koalapic.com' . $status['download_url']);
    file_put_contents('output.webp', $file);
    echo "Done! Saved output.webp (" . strlen($file) . " bytes)\n";
}

Enviar Comentarios

¡Gracias! Te responderemos pronto.

Instalar KoalaPic

Agrégalo a tu pantalla de inicio para acceso rápido

Preferencias de Cookies y Almacenamiento

Usamos cookies y almacenamiento local para mejorar tu experiencia. El almacenamiento esencial siempre está activo para el funcionamiento básico. Más información

Esencial

Protección CSRF, modo oscuro, seguimiento de errores. Siempre activo.

Funcional

Presets de conversión, preferencias de interfaz, estado de instalación de la PWA.

Análisis

Estadísticas de uso anónimas para mejorar el servicio.