List Printers

Discover installed Windows printers exposed to the local bridge.

GET /api/printers

Endpoint: GET /api/printers
Auth Scope: Profile Protected (verify_operational_profile_access)
Target Service: Local DaemonX Bridge Daemon (127.0.0.1:9123)
Introduced In: v1.0.0
Last Updated: v1.0.0


1. Description & Purpose

GET /api/printers queries the host machine's Windows Print Spooler (Win32_Printer) and returns an inventory of all currently installed printer devices, their associated driver names, assigned hardware ports (e.g. USB001, COM1, or IP socket ports), online readiness status, and default printer flag.

Web POS applications use this endpoint in Hardware / Register Settings to populate printer selection dropdowns for:

  • Thermal Receipt Printers (e.g., Epson TM-T82, Star TSP100, Rongta, Xprinter)
  • Kitchen Order Printers (KOT)
  • Full-page A4 / Letter Invoice Printers (Epson L-series, HP LaserJet, Canon)

2. Authentication & Required Headers

This endpoint requires counter credentials and verifies caller origin. It also enforces the operational offline gate (blocked with HTTP 403 if the workstation is offline and its emergency print allowance is exhausted).

Header NameTypeRequiredDescriptionExample
AcceptstringNoapplication/jsonapplication/json
OriginstringYesWeb POS browser origin. Must match counter's allowed_origins.https://pos.yourdomain.com
X-Bridge-Counter-Idstring (UUID)YesCounter ID registered in local DaemonX profile store.d402ddec-ecf7-4b39-b57a-86ce6008df05
X-Bridge-Profile-SecretstringYesCounter profile secret issued during pairing (dxp_...).dxp_202b541b2a72ecc32867e0f62b26b...

3. TypeScript Contracts

export interface PrinterInfo {
  name: string;
  driver_name: string;
  port_name: string;
  status: 'Ready' | string;
  is_default: boolean;
}

export interface DaemonXPrintersResponse {
  success: boolean;
  counter_id: string;
  printers: PrinterInfo[];
}

export interface DaemonXErrorResponse {
  detail: {
    error: string;
    message: string;
    counter_id?: string;
    offline_remaining?: number;
    reconnect_required?: boolean;
    gate_reason?: string;
    operation?: string;
  };
}

4. Response Field Matrix

FieldTypeDescription
successbooleantrue when query succeeds.
counter_idstringUUID of the authenticated counter profile.
printersPrinterInfo[]Array of installed Windows printer devices.
printers[].namestringExact Windows printer name. Pass this string to /api/print/* endpoints.
printers[].driver_namestringWindows driver model (e.g. "EPSON Advanced Printer Driver 6").
printers[].port_namestringWindows hardware port (e.g. "USB001", "192.168.1.100", "COM3").
printers[].statusstring"Ready" if online and ready to accept print spooler payloads.
printers[].is_defaultbooleantrue if this printer is configured as the Windows default device.

5. Real-World Response Examples

Example A: Successful Query (200 OK)

{
  "success": true,
  "counter_id": "d402ddec-ecf7-4b39-b57a-86ce6008df05",
  "printers": [
    {
      "name": "EPSON TM-T82III Receipt",
      "driver_name": "EPSON Advanced Printer Driver 6",
      "port_name": "USB001",
      "status": "Ready",
      "is_default": true
    },
    {
      "name": "EPSON L130 Series",
      "driver_name": "EPSON L130 Series",
      "port_name": "USB002",
      "status": "Ready",
      "is_default": false
    },
    {
      "name": "Microsoft Print to PDF",
      "driver_name": "Microsoft Print To PDF",
      "port_name": "PORTPROMPT:",
      "status": "Ready",
      "is_default": false
    }
  ]
}

Example B: Operational Lockout (403 Forbidden)

Returned when the workstation has been disconnected from Core and has exhausted all 30 emergency offline prints:

{
  "detail": {
    "error": "DAEMONX_OFFLINE_ALLOWANCE_EXHAUSTED",
    "message": "Emergency offline allowance exhausted. Reconnect this counter to continue.",
    "counter_id": "d402ddec-ecf7-4b39-b57a-86ce6008df05",
    "offline_remaining": 0,
    "reconnect_required": true,
    "gate_reason": "OFFLINE_ALLOWANCE_EXHAUSTED",
    "operation": "profile_operation"
  }
}

6. Integration Snippets

cURL

curl -X GET "http://127.0.0.1:9123/api/printers" \
  -H "X-Bridge-Counter-Id: d402ddec-ecf7-4b39-b57a-86ce6008df05" \
  -H "X-Bridge-Profile-Secret: dxp_202b541b2a72ecc32867e0f62b26b07be38024210e30af90" \
  -H "Origin: https://pos.yourdomain.com"

TypeScript Client Function

export async function getInstalledPrinters(
  counterId: string,
  profileSecret: string
): Promise<PrinterInfo[]> {
  const res = await fetch('http://127.0.0.1:9123/api/printers', {
    method: 'GET',
    headers: {
      'Accept': 'application/json',
      'X-Bridge-Counter-Id': counterId,
      'X-Bridge-Profile-Secret': profileSecret,
    },
  });

  if (!res.ok) {
    const errorData = await res.json().catch(() => null);
    if (res.status === 403 && errorData?.detail?.reconnect_required) {
      throw new Error('OFFLINE_LOCKED: Please reconnect terminal to internet.');
    }
    throw new Error(errorData?.detail?.message || `Failed to fetch printers (HTTP ${res.status})`);
  }

  const data: DaemonXPrintersResponse = await res.json();
  return data.printers;
}