API Documentation
The PrintCloud API lets you manage printers, submit print jobs, and monitor status programmatically.
Base URL: https://printcloud.abst.co.il/api
cURL
JavaScript
Python
PHP
C#
Overview
The API accepts JSON request bodies and returns JSON responses. All endpoints require authentication unless noted otherwise.
Authentication
Use HTTP Basic Authentication with your API key as the username and an empty password:
REQUEST
curl -u "pk_live_your_api_key :" \
https://printcloud.abst.co.il/api/printers
const response = await fetch('https://printcloud.abst.co.il/api/printers ', {
headers : {
'Authorization ': 'Basic ' + btoa('pk_live_your_api_key: ')
}
});
const data = await response.json();
import requests
response = requests.get(
'https://printcloud.abst.co.il/api/printers ',
auth=('pk_live_your_api_key ', '')
)
data = response.json()
$ch = curl_init('https://printcloud.abst.co.il/api/printers ');
curl_setopt($ch, CURLOPT_USERPWD, 'pk_live_your_api_key: ');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true );
$response = curl_exec($ch);
$data = json_decode($response, true );
using var client = new HttpClient();
var auth = Convert.ToBase64String(
Encoding.UTF8.GetBytes("pk_live_your_api_key: "));
client.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Basic ", auth);
var response = await client.GetAsync(
"https://printcloud.abst.co.il/api/printers ");
var data = await response.Content.ReadAsStringAsync();
HEADER
Authorization: Basic cGtfbGl2ZV94eHg6
# base64("pk_live_your_api_key:")
Rate Limiting
The API is limited to 10 requests per second per account. If exceeded, you will receive 429 Too Many Requests.
Errors
Error responses follow this format:
{
"code ": "Unauthorized ",
"message ": "Authentication required "
}
Code Meaning
400 Bad request — invalid parameters
401 Unauthorized — invalid or missing API key
403 Forbidden — insufficient permissions
404 Not found
429 Rate limit exceeded
500 Server error
Printers
GET /api/printers
List all printers across all your computers.
REQUEST
curl -u "pk_live_your_api_key :" \
https://printcloud.abst.co.il/api/printers
const response = await fetch('https://printcloud.abst.co.il/api/printers ', {
headers : {
'Authorization ': 'Basic ' + btoa('pk_live_your_api_key: ')
}
});
const data = await response.json();
import requests
response = requests.get(
'https://printcloud.abst.co.il/api/printers ',
auth=('pk_live_your_api_key ', '')
)
data = response.json()
$ch = curl_init('https://printcloud.abst.co.il/api/printers ');
curl_setopt($ch, CURLOPT_USERPWD, 'pk_live_your_api_key: ');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true );
$response = curl_exec($ch);
$data = json_decode($response, true );
using var client = new HttpClient();
var auth = Convert.ToBase64String(
Encoding.UTF8.GetBytes("pk_live_your_api_key: "));
client.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Basic ", auth);
var response = await client.GetAsync(
"https://printcloud.abst.co.il/api/printers ");
var data = await response.Content.ReadAsStringAsync();
RESPONSE 200
[
{
"id ": "clx8f3b2c1... ",
"name ": "HP LaserJet Pro ",
"computerId ": "clx456... ",
"state ": "online ",
"isDefault ": true ,
"capabilities ": {
"color ": true ,
"duplex ": true ,
"media ": ["A4 ","Letter "],
"bins ": ["Tray 1 ","Manual "]
}
}
]
GET /api/computers/:id/printers
List printers for a specific computer.
Print Jobs
POST /api/printjobs
Create a new print job. This is the main endpoint for sending documents to printers.
Parameter Type Description
printerId string required Target printer ID
contentType string required pdf_uri | pdf_base64 | raw_uri | raw_base64
content string required Document URI or base64-encoded data
title string Job title (default: "Untitled")
qty integer Number of times to print (default: 1)
options object Print options (see below)
Print Options
Option Type Description
copies integer Number of copies (1-999)
color boolean Color printing (true/false)
duplex string one-sided | long-edge | short-edge
paper string Paper size name (e.g. "A4", "Letter")
media string Paper tray/bin name
pages string Page range (e.g. "1-5", "1,3,5")
fit_to_page boolean Scale to fit page
Example: Print PDF from URL
REQUEST
curl -u "pk_live_your_api_key :" \
-X POST https://printcloud.abst.co.il/api/printjobs \
-H "Content-Type: application/json" \
-d '{
"printerId ": "clx8f3b2c1 ",
"contentType ": "pdf_uri ",
"content ": "https://example.com/invoice.pdf ",
"title ": "Invoice #456 ",
"options ": {
"copies ": 2 ,
"duplex ": "long-edge ",
"color ": false
}
}'
const response = await fetch('https://printcloud.abst.co.il/api/printjobs ', {
method : 'POST ',
headers : {
'Authorization ': 'Basic ' + btoa('pk_live_your_api_key: '),
'Content-Type ': 'application/json '
},
body : JSON.stringify({
printerId : 'clx8f3b2c1 ',
contentType : 'pdf_uri ',
content : 'https://example.com/invoice.pdf ',
title : 'Invoice #456 ',
options : {
copies : 2 ,
duplex : 'long-edge ',
color : false
}
})
});
const data = await response.json();
import requests
response = requests.post(
'https://printcloud.abst.co.il/api/printjobs ',
auth=('pk_live_your_api_key ', ''),
json={
'printerId ': 'clx8f3b2c1 ',
'contentType ': 'pdf_uri ',
'content ': 'https://example.com/invoice.pdf ',
'title ': 'Invoice #456 ',
'options ': {
'copies ': 2 ,
'duplex ': 'long-edge ',
'color ': False
}
}
)
data = response.json()
$ch = curl_init('https://printcloud.abst.co.il/api/printjobs ');
curl_setopt($ch, CURLOPT_USERPWD, 'pk_live_your_api_key: ');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt($ch, CURLOPT_POST, true );
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json '
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
'printerId ' => 'clx8f3b2c1 ',
'contentType ' => 'pdf_uri ',
'content ' => 'https://example.com/invoice.pdf ',
'title ' => 'Invoice #456 ',
'options ' => [
'copies ' => 2 ,
'duplex ' => 'long-edge ',
'color ' => false
]
]));
$response = curl_exec($ch);
$data = json_decode($response, true );
using var client = new HttpClient();
var auth = Convert.ToBase64String(
Encoding.UTF8.GetBytes("pk_live_your_api_key: "));
client.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Basic ", auth);
var body = new StringContent(
JsonSerializer.Serialize(new {
printerId = "clx8f3b2c1 ",
contentType = "pdf_uri ",
content = "https://example.com/invoice.pdf ",
title = "Invoice #456 ",
options = new {
copies = 2 ,
duplex = "long-edge ",
color = false
}
}),
Encoding.UTF8,
"application/json ");
var response = await client.PostAsync(
"https://printcloud.abst.co.il/api/printjobs ", body);
var data = await response.Content.ReadAsStringAsync();
RESPONSE 201
// Returns the print job ID
"pj_a8f3b2c1d4e5f6g7 "
// The job goes through states:
// pending → sent → printing → completed
//
// If the client is online, the job
// is dispatched immediately.
// If offline, it waits until
// the client reconnects.
Example: Print RAW (ZPL label)
REQUEST
curl -u "pk_live_your_api_key :" \
-X POST https://printcloud.abst.co.il/api/printjobs \
-H "Content-Type: application/json" \
-d '{
"printerId ": "clx_zebra_01 ",
"contentType ": "raw_base64 ",
"content ": "XlhBXkZPNTAs... ",
"title ": "Shipping Label "
}'
const response = await fetch('https://printcloud.abst.co.il/api/printjobs ', {
method : 'POST ',
headers : {
'Authorization ': 'Basic ' + btoa('pk_live_your_api_key: '),
'Content-Type ': 'application/json '
},
body : JSON.stringify({
printerId : 'clx_zebra_01 ',
contentType : 'raw_base64 ',
content : 'XlhBXkZPNTAs... ',
title : 'Shipping Label '
})
});
const data = await response.json();
import requests
response = requests.post(
'https://printcloud.abst.co.il/api/printjobs ',
auth=('pk_live_your_api_key ', ''),
json={
'printerId ': 'clx_zebra_01 ',
'contentType ': 'raw_base64 ',
'content ': 'XlhBXkZPNTAs... ',
'title ': 'Shipping Label '
}
)
data = response.json()
$ch = curl_init('https://printcloud.abst.co.il/api/printjobs ');
curl_setopt($ch, CURLOPT_USERPWD, 'pk_live_your_api_key: ');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt($ch, CURLOPT_POST, true );
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json '
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
'printerId ' => 'clx_zebra_01 ',
'contentType ' => 'raw_base64 ',
'content ' => 'XlhBXkZPNTAs... ',
'title ' => 'Shipping Label '
]));
$response = curl_exec($ch);
$data = json_decode($response, true );
using var client = new HttpClient();
var auth = Convert.ToBase64String(
Encoding.UTF8.GetBytes("pk_live_your_api_key: "));
client.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Basic ", auth);
var body = new StringContent(
JsonSerializer.Serialize(new {
printerId = "clx_zebra_01 ",
contentType = "raw_base64 ",
content = "XlhBXkZPNTAs... ",
title = "Shipping Label "
}),
Encoding.UTF8,
"application/json ");
var response = await client.PostAsync(
"https://printcloud.abst.co.il/api/printjobs ", body);
var data = await response.Content.ReadAsStringAsync();
RESPONSE 201
// RAW data is sent directly to the
// printer without driver conversion.
// Use for ZPL, EPL, ESC/POS.
"pj_b2c1d4e5f6g7h8 "
GET /api/printjobs
List print job history. Supports query params: ?limit=100&dir=desc
REQUEST
curl -u "pk_live_your_api_key :" \
"https://printcloud.abst.co.il/api/printjobs?limit=5"
const response = await fetch('https://printcloud.abst.co.il/api/printjobs?limit=5 ', {
headers : {
'Authorization ': 'Basic ' + btoa('pk_live_your_api_key: ')
}
});
const data = await response.json();
import requests
response = requests.get(
'https://printcloud.abst.co.il/api/printjobs ',
auth=('pk_live_your_api_key ', ''),
params={'limit ': 5 }
)
data = response.json()
$ch = curl_init('https://printcloud.abst.co.il/api/printjobs?limit=5 ');
curl_setopt($ch, CURLOPT_USERPWD, 'pk_live_your_api_key: ');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true );
$response = curl_exec($ch);
$data = json_decode($response, true );
using var client = new HttpClient();
var auth = Convert.ToBase64String(
Encoding.UTF8.GetBytes("pk_live_your_api_key: "));
client.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Basic ", auth);
var response = await client.GetAsync(
"https://printcloud.abst.co.il/api/printjobs?limit=5 ");
var data = await response.Content.ReadAsStringAsync();
RESPONSE 200
[
{
"id ": "pj_a8f3b2c1 ",
"title ": "Invoice #456 ",
"state ": "completed ",
"contentType ": "pdf_uri ",
"printer ": {
"name ": "HP LaserJet "
},
"createdAt ": "2026-04-05T... "
}
]
DELETE /api/printjobs/:ids
Delete print jobs.
REQUEST
curl -u "pk_live_your_api_key :" \
-X DELETE \
"https://printcloud.abst.co.il/api/printjobs/pj_a8f3,pj_b2c1"
const response = await fetch('https://printcloud.abst.co.il/api/printjobs/pj_a8f3,pj_b2c1 ', {
method : 'DELETE ',
headers : {
'Authorization ': 'Basic ' + btoa('pk_live_your_api_key: ')
}
});
const data = await response.json();
import requests
response = requests.delete(
'https://printcloud.abst.co.il/api/printjobs/pj_a8f3,pj_b2c1 ',
auth=('pk_live_your_api_key ', '')
)
data = response.json()
$ch = curl_init('https://printcloud.abst.co.il/api/printjobs/pj_a8f3,pj_b2c1 ');
curl_setopt($ch, CURLOPT_USERPWD, 'pk_live_your_api_key: ');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE ');
$response = curl_exec($ch);
$data = json_decode($response, true );
using var client = new HttpClient();
var auth = Convert.ToBase64String(
Encoding.UTF8.GetBytes("pk_live_your_api_key: "));
client.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Basic ", auth);
var response = await client.DeleteAsync(
"https://printcloud.abst.co.il/api/printjobs/pj_a8f3,pj_b2c1 ");
var data = await response.Content.ReadAsStringAsync();
RESPONSE 200
["pj_a8f3 ", "pj_b2c1 "]
Job States
State Description
pendingJob created, waiting for client
sentSent to desktop client
printingClient is printing
completedSuccessfully printed
errorPrint failed
Computers
GET /api/computers
List all computers connected to your account.
REQUEST
curl -u "pk_live_your_api_key :" \
https://printcloud.abst.co.il/api/computers
const response = await fetch('https://printcloud.abst.co.il/api/computers ', {
headers : {
'Authorization ': 'Basic ' + btoa('pk_live_your_api_key: ')
}
});
const data = await response.json();
import requests
response = requests.get(
'https://printcloud.abst.co.il/api/computers ',
auth=('pk_live_your_api_key ', '')
)
data = response.json()
$ch = curl_init('https://printcloud.abst.co.il/api/computers ');
curl_setopt($ch, CURLOPT_USERPWD, 'pk_live_your_api_key: ');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true );
$response = curl_exec($ch);
$data = json_decode($response, true );
using var client = new HttpClient();
var auth = Convert.ToBase64String(
Encoding.UTF8.GetBytes("pk_live_your_api_key: "));
client.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Basic ", auth);
var response = await client.GetAsync(
"https://printcloud.abst.co.il/api/computers ");
var data = await response.Content.ReadAsStringAsync();
RESPONSE 200
[
{
"id ": "clx456... ",
"name ": "Office-PC ",
"os ": "Windows ",
"state ": "online ",
"clientVersion ": "1.0.0 ",
"printers ": [ ... ],
"lastSeenAt ": "2026-04-05T... "
}
]
DELETE /api/computers/:ids
Remove computers from your account.
Webhooks
POST /api/webhooks
Create a webhook.
REQUEST
curl -u "pk_live_your_api_key :" \
-X POST https://printcloud.abst.co.il/api/webhooks \
-H "Content-Type: application/json" \
-d '{
"url ": "https://your.server/hook ",
"secret ": "my_secret_123 ",
"events ": [
"job.state ",
"printer.state "
]
}'
const response = await fetch('https://printcloud.abst.co.il/api/webhooks ', {
method : 'POST ',
headers : {
'Authorization ': 'Basic ' + btoa('pk_live_your_api_key: '),
'Content-Type ': 'application/json '
},
body : JSON.stringify({
url : 'https://your.server/hook ',
secret : 'my_secret_123 ',
events : [
'job.state ',
'printer.state '
]
})
});
const data = await response.json();
import requests
response = requests.post(
'https://printcloud.abst.co.il/api/webhooks ',
auth=('pk_live_your_api_key ', ''),
json={
'url ': 'https://your.server/hook ',
'secret ': 'my_secret_123 ',
'events ': [
'job.state ',
'printer.state '
]
}
)
data = response.json()
$ch = curl_init('https://printcloud.abst.co.il/api/webhooks ');
curl_setopt($ch, CURLOPT_USERPWD, 'pk_live_your_api_key: ');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt($ch, CURLOPT_POST, true );
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json '
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
'url ' => 'https://your.server/hook ',
'secret ' => 'my_secret_123 ',
'events ' => [
'job.state ',
'printer.state '
]
]));
$response = curl_exec($ch);
$data = json_decode($response, true );
using var client = new HttpClient();
var auth = Convert.ToBase64String(
Encoding.UTF8.GetBytes("pk_live_your_api_key: "));
client.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Basic ", auth);
var body = new StringContent(
JsonSerializer.Serialize(new {
url = "https://your.server/hook ",
secret = "my_secret_123 ",
events = new [] {
"job.state ",
"printer.state "
}
}),
Encoding.UTF8,
"application/json ");
var response = await client.PostAsync(
"https://printcloud.abst.co.il/api/webhooks ", body);
var data = await response.Content.ReadAsStringAsync();
RESPONSE 201
{
"id ": "wh_x1y2z3... ",
"url ": "https://your.server/hook ",
"events ": ["job.state ","printer.state "],
"active ": true
}
// When an event fires, we POST to your URL:
{
"type ": "job.state ",
"jobId ": "pj_xxx ",
"state ": "completed ",
"timestamp ": "2026-04-05T... "
}
// Header: X-PrintCloud-Webhook-Secret: my_secret_123
Webhook Events
Event Description
allAll events
job.createdNew print job submitted
job.stateJob state changed
computer.connectedClient computer connected
computer.disconnectedClient computer disconnected
printer.statePrinter state changed
API Keys
POST /api/account/apikeys
Create a new API key.
REQUEST
curl -u "pk_live_your_api_key :" \
-X POST https://printcloud.abst.co.il/api/account/apikeys \
-H "Content-Type: application/json" \
-d '{
"description ": "Production ",
"permission ": "full "
}'
const response = await fetch('https://printcloud.abst.co.il/api/account/apikeys ', {
method : 'POST ',
headers : {
'Authorization ': 'Basic ' + btoa('pk_live_your_api_key: '),
'Content-Type ': 'application/json '
},
body : JSON.stringify({
description : 'Production ',
permission : 'full '
})
});
const data = await response.json();
import requests
response = requests.post(
'https://printcloud.abst.co.il/api/account/apikeys ',
auth=('pk_live_your_api_key ', ''),
json={
'description ': 'Production ',
'permission ': 'full '
}
)
data = response.json()
$ch = curl_init('https://printcloud.abst.co.il/api/account/apikeys ');
curl_setopt($ch, CURLOPT_USERPWD, 'pk_live_your_api_key: ');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt($ch, CURLOPT_POST, true );
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json '
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
'description ' => 'Production ',
'permission ' => 'full '
]));
$response = curl_exec($ch);
$data = json_decode($response, true );
using var client = new HttpClient();
var auth = Convert.ToBase64String(
Encoding.UTF8.GetBytes("pk_live_your_api_key: "));
client.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Basic ", auth);
var body = new StringContent(
JsonSerializer.Serialize(new {
description = "Production ",
permission = "full "
}),
Encoding.UTF8,
"application/json ");
var response = await client.PostAsync(
"https://printcloud.abst.co.il/api/account/apikeys ", body);
var data = await response.Content.ReadAsStringAsync();
RESPONSE 201
{
"id ": "key_abc123 ",
"key ": "pk_live_a1b2c3d4... ",
"description ": "Production "
}
// Save the key — you won't see it again!
// Permissions: full | print_only | read_only
DELETE /api/account/apikeys/:id
Revoke an API key.
Client Login
Used by the desktop client to authenticate with email/password and receive an API key.
POST /api/client/login
No authentication required.
REQUEST
curl -X POST https://printcloud.abst.co.il/api/client/login \
-H "Content-Type: application/json" \
-d '{
"email ": "user@example.com ",
"password ": "your_password "
}'
const response = await fetch('https://printcloud.abst.co.il/api/client/login ', {
method : 'POST ',
headers : {
'Content-Type ': 'application/json '
},
body : JSON.stringify({
email : 'user@example.com ',
password : 'your_password '
})
});
const data = await response.json();
import requests
response = requests.post(
'https://printcloud.abst.co.il/api/client/login ',
json={
'email ': 'user@example.com ',
'password ': 'your_password '
}
)
data = response.json()
$ch = curl_init('https://printcloud.abst.co.il/api/client/login ');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt($ch, CURLOPT_POST, true );
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json '
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
'email ' => 'user@example.com ',
'password ' => 'your_password '
]));
$response = curl_exec($ch);
$data = json_decode($response, true );
using var client = new HttpClient();
var body = new StringContent(
JsonSerializer.Serialize(new {
email = "user@example.com ",
password = "your_password "
}),
Encoding.UTF8,
"application/json ");
var response = await client.PostAsync(
"https://printcloud.abst.co.il/api/client/login ", body);
var data = await response.Content.ReadAsStringAsync();
RESPONSE 200
{
"success ": true ,
"apiKey ": "pk_live_a1b2c3... ",
"user ": {
"id ": "usr_xxx ",
"firstName ": "John ",
"lastName ": "Doe ",
"email ": "user@example.com "
}
}
WebSocket Protocol
The desktop client connects via WebSocket for real-time communication.
Endpoint: wss://printcloud.abst.co.il/ws
Authentication
SEND
{
"type ": "auth ",
"apiKey ": "pk_live_your_api_key ",
"computerName ": "Office-PC ",
"os ": "Windows ",
"clientVersion ": "1.0.0 "
}
RECEIVE
{
"type ": "auth_ok ",
"computerId ": "clx456... "
}
// On failure:
{
"type ": "auth_error ",
"message ": "Invalid API key "
}
Report Printers
SEND
{
"type ": "printers ",
"printers ": [{
"name ": "HP LaserJet Pro ",
"capabilities ": {
"color ": true ,
"duplex ": true
},
"isDefault ": true
}]
}
RECEIVE
{
"type ": "printers_ok ",
"count ": 1
}
Receive Print Job
RECEIVE (from server)
{
"type ": "print_job ",
"job ": {
"id ": "pj_xxx ",
"printerName ": "HP LaserJet ",
"contentType ": "pdf_base64 ",
"content ": "JVBERi0xLjQ... ",
"title ": "Invoice #456 ",
"options ": {
"copies ": 2
}
}
}
SEND (report result)
// On success:
{
"type ": "job_state ",
"jobId ": "pj_xxx ",
"state ": "completed ",
"message ": "Printed to HP LaserJet "
}
// On failure:
{
"type ": "job_state ",
"jobId ": "pj_xxx ",
"state ": "error ",
"message ": "Printer offline "
}