Developer API

Developer API

Integrate AI-powered PDF and image processing into your applications with simple, affordable REST APIs.

Getting Started

Base URL: https://penkara.com/api/v1

All API requests require authentication via an API key sent as a Bearer token in the Authorization header.

curl example
curl -X POST https://penkara.com/api/v1/remove-background \
  -H "Authorization: Bearer smt-your-api-key-here" \
  -F "image=@photo.jpg"

Authentication

All protected endpoints require an API key. Generate one from your dashboard.

Headers

Send your API key in the Authorization: Bearer <key> header.

SDK Libraries

Use the raw API examples below — no SDK required. Here are quick-reference examples for each language:

Endpoints

POST /remove-background

Remove the background from an image using color detection and edge analysis.

Request

Parameter Type Required Description
image file Yes Image file (JPG, PNG, WebP, max 15MB)
output_format string No png (default), jpg, webp

Code Examples

curl -X POST https://penkara.com/api/v1/remove-background \
  -H "Authorization: Bearer smt-your-api-key-here" \
  -F "image=@photo.jpg"
use Illuminate\Support\Facades\Http;

$response = Http::withToken('smt-your-api-key-here')
    ->attach('image', file_get_contents('photo.jpg'), 'photo.jpg')
    ->post('https://penkara.com/api/v1/remove-background');

$result = $response->json();

if ($result['success']) {
    echo $result['data']['url'];
}
const fs = require('fs');
const FormData = require('form-data');
const axios = require('axios');

const form = new FormData();
form.append('image', fs.createReadStream('photo.jpg'));

const response = await axios.post(
  'https://penkara.com/api/v1/remove-background',
  form,
  {
    headers: {
      ...form.getHeaders(),
      'Authorization': 'Bearer smt-your-api-key-here',
    },
  }
);

console.log(response.data.data.url);
import requests

response = requests.post(
    'https://penkara.com/api/v1/remove-background',
    headers={'Authorization': 'Bearer smt-your-api-key-here'},
    files={'image': open('photo.jpg', 'rb')},
)

result = response.json()
print(result['data']['url'])
using (var client = new HttpClient())
{
    client.DefaultRequestHeaders.Add(
        "Authorization", "Bearer smt-your-api-key-here");

    using var form = new MultipartFormDataContent();
    form.Add(new ByteArrayContent(File.ReadAllBytes("photo.jpg")),
        "image", "photo.jpg");

    var response = await client.PostAsync(
        "https://penkara.com/api/v1/remove-background",
        form);

    var json = await response.Content.ReadAsStringAsync();
    Console.WriteLine(json);
}

Response

{
  "success": true,
  "data": {
    "url": "https://penkara.com/storage/api/remove-bg/uuid.png",
    "width": 1920,
    "height": 1080,
    "format": "png",
    "size_bytes": 245678
  }
}

Cost: 5 credits

POST /screenshot

Capture a full-page or viewport screenshot of any public website.

Request

Parameter Type Required Description
url string Yes Website URL (http/https only)
viewport string No desktop (default), laptop, tablet, mobile
full_page boolean No Capture full page (default: true)
delay integer No Delay in ms before capture (default: 2000)
format string No png (default), jpg, webp

Code Examples

curl -X POST https://penkara.com/api/v1/screenshot \
  -H "Authorization: Bearer smt-your-api-key-here" \
  -F "url=https://example.com" \
  -F "viewport=desktop" \
  -F "full_page=true"
use Illuminate\Support\Facades\Http;

$response = Http::withToken('smt-your-api-key-here')
    ->asMultipart()
    ->post('https://penkara.com/api/v1/screenshot', [
        'url' => 'https://example.com',
        'viewport' => 'desktop',
        'full_page' => 'true',
    ]);

$result = $response->json();
echo $result['data']['url'];
const axios = require('axios');

const response = await axios.post(
  'https://penkara.com/api/v1/screenshot',
  new URLSearchParams({
    url: 'https://example.com',
    viewport: 'desktop',
    full_page: 'true',
  }),
  {
    headers: {
      'Authorization': 'Bearer smt-your-api-key-here',
    },
  }
);

console.log(response.data.data.url);
import requests

response = requests.post(
    'https://penkara.com/api/v1/screenshot',
    headers={'Authorization': 'Bearer smt-your-api-key-here'},
    data={
        'url': 'https://example.com',
        'viewport': 'desktop',
        'full_page': 'true',
    },
)

result = response.json()
print(result['data']['url'])
using (var client = new HttpClient())
{
    client.DefaultRequestHeaders.Add(
        "Authorization", "Bearer smt-your-api-key-here");

    var data = new Dictionary<string, string>
    {
        ["url"] = "https://example.com",
        ["viewport"] = "desktop",
        ["full_page"] = "true",
    };

    var response = await client.PostAsync(
        "https://penkara.com/api/v1/screenshot",
        new FormUrlEncodedContent(data));

    var json = await response.Content.ReadAsStringAsync();
    Console.WriteLine(json);
}

Response

{
  "success": true,
  "data": {
    "url": "https://penkara.com/storage/api/screenshots/uuid.png",
    "viewport": "1920x1080",
    "full_page": true,
    "format": "png",
    "size_bytes": 345678,
    "engine": "playwright"
  }
}

Cost: 2 credits

POST /ocr

Extract text from PDF documents or images using Optical Character Recognition.

Request

Parameter Type Required Description
file file Yes PDF or image file (max 50MB)
language string No OCR language (default: eng). Supports ara, spa, fra, deu, etc.
output_format string No txt (default) or docx

Code Examples

curl -X POST https://penkara.com/api/v1/ocr \
  -H "Authorization: Bearer smt-your-api-key-here" \
  -F "file=@document.pdf" \
  -F "language=eng" \
  -F "output_format=txt"
use Illuminate\Support\Facades\Http;

$response = Http::withToken('smt-your-api-key-here')
    ->attach('file', file_get_contents('document.pdf'), 'document.pdf')
    ->post('https://penkara.com/api/v1/ocr', [
        'language' => 'eng',
        'output_format' => 'txt',
    ]);

$result = $response->json();
echo $result['data']['text'];
const fs = require('fs');
const FormData = require('form-data');
const axios = require('axios');

const form = new FormData();
form.append('file', fs.createReadStream('document.pdf'));
form.append('language', 'eng');
form.append('output_format', 'txt');

const response = await axios.post(
  'https://penkara.com/api/v1/ocr',
  form,
  {
    headers: {
      ...form.getHeaders(),
      'Authorization': 'Bearer smt-your-api-key-here',
    },
  }
);

console.log(response.data.data.text);
import requests

response = requests.post(
    'https://penkara.com/api/v1/ocr',
    headers={'Authorization': 'Bearer smt-your-api-key-here'},
    files={'file': open('document.pdf', 'rb')},
    data={
        'language': 'eng',
        'output_format': 'txt',
    },
)

result = response.json()
print(result['data']['text'])
using (var client = new HttpClient())
{
    client.DefaultRequestHeaders.Add(
        "Authorization", "Bearer smt-your-api-key-here");

    using var form = new MultipartFormDataContent();
    form.Add(new ByteArrayContent(File.ReadAllBytes("document.pdf")),
        "file", "document.pdf");
    form.Add(new StringContent("eng"), "language");
    form.Add(new StringContent("txt"), "output_format");

    var response = await client.PostAsync(
        "https://penkara.com/api/v1/ocr",
        form);

    var json = await response.Content.ReadAsStringAsync();
    Console.WriteLine(json);
}

Response

{
  "success": true,
  "data": {
    "text": "Extracted text content...",
    "url": "https://penkara.com/storage/api/ocr/uuid.txt",
    "format": "txt",
    "length": 12345,
    "pages": 3,
    "language": "eng"
  }
}

Cost: 3 credits

Error Handling

The API returns standard HTTP status codes and JSON error responses:

{
  "error": "Insufficient credits. Purchase more credits from your dashboard."
}
// HTTP 402 — Insufficient credits

{
  "error": "Invalid or inactive API key"
}
// HTTP 401 — Unauthorized

{
  "error": "Missing API key. Provide it via Authorization: Bearer "
}
// HTTP 401 — Missing token

Rate Limits

Rate limits are enforced per API key. Default is 60 requests per minute. You can configure this when creating your API key.

Credit Costs

Remove Background

5 credits

Website Screenshot

2 credits

OCR PDF / Image

3 credits

Get Started

Ready to Start Building?

Generate your first API key and get started in minutes.

We use cookies to enhance your experience, analyze site traffic, and serve personalized content. Privacy Policy