GET /jobs/{jobId}
Returns the current state of a print job. The state is queried live from CUPS on each request.
Use this endpoint to poll for completion after submitting a job with wait: false via POST /print/{target}.
Endpoint:
GET /api/v1/jobs/{jobId}Path Parameter
Section titled “Path Parameter”| Parameter | Type | Description |
|---|---|---|
jobId | string | The job ID returned by POST /print/{target} (e.g. pj_a8f3e1b2). |
Response
Section titled “Response”{ "status": "success", "statusCode": 200, "result": { "module": "/jobs/pj_a8f3e1b2", "message": "Job retrieved.", "content": { "jobId": "pj_a8f3e1b2", "printer": "tcp_192-168-86-250_9100", "target": "tag_LABELS", "title": "Shipping Label #1234", "source": "my-erp", "contentType": "raw_base64", "size": 1024, "state": "completed", "error": null, "createdAt": "2026-03-28T14:30:00.000Z", "completedAt": "2026-03-28T14:30:08.500Z", "cupsJobId": "ProxyBox_Labels-42" } }}Job Object Fields
Section titled “Job Object Fields”| Field | Type | Description |
|---|---|---|
jobId | string | ProxyBox job ID. |
printer | string | Printer path that received the job. |
target | string | Original target from the request. |
title | string | Job title. |
source | string | null | Submitting application or user. |
contentType | string | Content type used (e.g. pdf_base64, raw_url). |
size | number | Document size in bytes. |
state | string | Current state (see below). |
error | string | null | Error message if failed. |
createdAt | string | ISO 8601 timestamp. |
completedAt | string | null | ISO 8601 timestamp, or null if still active. |
cupsJobId | string | null | CUPS internal job ID. For debugging only. |
Job States
Section titled “Job States”| State | Description |
|---|---|
queued | Submitted to CUPS, waiting to print. |
printing | CUPS is actively sending data to the printer. |
completed | Finished successfully. |
failed | CUPS error or pre-flight check failed. |
Error: 404 — Job Not Found
Section titled “Error: 404 — Job Not Found”Returned when the job ID doesn’t exist or has expired from memory (jobs are kept for 1 hour).
{ "status": "error", "statusCode": 404, "result": { "module": "/jobs/pj_00000000", "message": "Job not found", "content": { "message": "No job with ID: pj_00000000" } }}Polling Example
Section titled “Polling Example”// Submit a non-waiting print jobconst printRes = await fetch('https://pbx-ABCD.pbxz.io/api/v1/print/tag_LABELS', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-API-Key': 'YOUR_KEY' }, body: JSON.stringify({ content: 'XlhBXkZPNTAuNTBeQTBOLDUwLDUwXkZESGVsbG8gV29ybGReRlNeWFo=', contentType: 'raw_base64', wait: false })});const { result } = await printRes.json();const jobId = result.content.jobId;
// Poll until completelet state = 'queued';while (state === 'queued' || state === 'printing') { await new Promise(r => setTimeout(r, 2000)); const jobRes = await fetch(`https://pbx-ABCD.pbxz.io/api/v1/jobs/${jobId}`, { headers: { 'X-API-Key': 'YOUR_KEY' } }); const job = await jobRes.json(); state = job.result.content.state;}console.log(`Job ${jobId}: ${state}`);