Skip to content

Epson Receipt Printers

ProxyBox supports Epson TM-series POS thermal printers (receipt printers) over USB as raw ESC/POS devices. Like Zebra printers, these are pass-through: your application generates the ESC/POS byte stream and ProxyBox delivers it to the printer unmodified — no driver processing, no rendering.

Plug the printer in via USB and it’s auto-discovered. This includes older TM-series units with UB-* USB interface boards that don’t report a USB serial number — ProxyBox derives a stable printer path from the USB identity, so the path survives reboots.

Newer models with built-in USB (TM-T20III, TM-m30III, etc.) work the same way. The printer appears in the Printers module with a raw content type and a path like usb_sn_<serial> (or a synthetic identifier for serial-less units).

POST the raw bytes directly:

Terminal window
curl -X POST https://pbx-D8A4.pbxz.io/api/v1/print/usb_sn_X7A123456 \
-H 'Content-Type: application/octet-stream' \
-H 'X-API-Key: ULA9WHXMFCHF' \
--data-binary @receipt.bin

ESC/POS is a binary format, so when submitting through JSON use contentType: "raw_base64" and base64-encode the bytes. A minimal receipt in JavaScript:

const ESC = 0x1b, GS = 0x1d;
const bytes = Buffer.concat([
Buffer.from([ESC, 0x40]), // ESC @ — initialize printer
Buffer.from('Hello from ProxyBox\n\n\n'), // text + feed
Buffer.from([GS, 0x56, 0x41, 0x03]), // GS V A 3 — feed and cut
]);
await fetch('https://pbx-D8A4.pbxz.io/api/v1/print/usb_sn_X7A123456', {
method: 'POST',
headers: { 'Content-Type': 'application/json', 'X-API-Key': 'ULA9WHXMFCHF' },
body: JSON.stringify({ content: bytes.toString('base64'), contentType: 'raw_base64' }),
});

Any ESC/POS library works — the popular ones for Node, Python, and Go all produce a byte buffer you can submit exactly like this.

The Test Print button (and POST /print/{target}/test) prints a branded ESC/POS test receipt, formatted for standard 80mm receipt paper.

  • Everything passes through. Formatting commands, barcodes, QR codes, and peripheral commands like the cash-drawer kick (ESC p) are all just bytes to ProxyBox — if the printer supports it, it works.
  • No status feedback. ESC/POS status queries are request/response over the USB channel, which the raw print path doesn’t read. A paper-out condition won’t fail the job — check the printer’s LEDs if receipts stop coming out.
  • Monochrome thermal. Like all receipt printers, output is black-on-white only.

ProxyBox Docs v1.0.6