# Raw TCP Port 9100

Network thermal printers do not speak HTTP. They listen on a plain TCP socket — usually port **9100**,
the convention known as JetDirect or AppSocket — and print whatever bytes arrive until the sender closes
the connection. There is no request, no response, and no framing: the socket *is* the protocol.

virtual-printer.online works the same way, on the public internet.

## Yes, there is a real public port

Every printer you create gets its own always-online TCP listener on `virtual-printer.online`, reachable
from anywhere. Point your POS software at `virtual-printer.online:<your port>`, write ESC/POS or EPL
bytes, close the connection, and the rendered receipt appears in the browser.

That means:

- **Nothing to install.** No Docker container, no local bridge, no browser extension, no agent.
- **No HTTP wrapper in the print path.** You do not POST your payload anywhere; the code under test
  opens a socket, exactly as it does against real hardware.
- **The browser is optional.** It does not need to be open while you print — parsing and rendering
  happen on the server.

The HTTP/REST API exists as well, but for managing printers and reading documents back. Printing itself
is always raw TCP.

## Which port do I get?

Network thermal printers listen for raw TCP jobs on port **9100**, and virtual-printer.online hands out
its ports from that same block. Port 9100 itself is the anchor of the range and is never assigned;
printers are numbered upward from it — 9101, 9102, 9103, and so on. Ports taken by printers registered
before yours stay taken, so a printer created today is assigned the next free port above them.

The assigned port is **permanent**: it belongs to that printer until you delete the printer, or until the
workspace expires after a year with nobody opening it or reading a document from it. So you can put it in
your POS configuration and leave it there. Assignment is automatic — you cannot request a specific port,
and in particular you cannot claim 9100 itself.

## Finding your port

The port is printed on the printer's card in the web interface, and returned as
`settings.tcpListenPort` by the API when you create or fetch a printer, alongside `settings.publicHost`.

## Checking that the port is reachable

Before wiring up your application, confirm the path works from where your code runs:

```bash
# Linux / macOS
printf 'Hello


' | nc virtual-printer.online 9411

# Windows PowerShell - connectivity only, sends nothing
Test-NetConnection virtual-printer.online -Port 9411
```

Substitute your own port. If the connection is refused, start with
[Connection refused](/docs/troubleshooting) — the usual causes are a stopped printer or an outbound
firewall that only allows 80 and 443.

## Security

Raw TCP is unencrypted, by definition of what a printer socket is. Anything you print to the hosted
service travels in the clear — see [Security guidelines](/docs/policies/security) before sending
anything that resembles a real receipt.
