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 -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
/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
/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
/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
Ready to Start Building?
Generate your first API key and get started in minutes.