Cloud print dispatch, without the per-printer tax.

Send receipts and documents from your cloud app to any thermal or desktop printer through one API and a tiny bridge agent. A PrintNode alternative with flat plans, a real job state machine, and server-side receipt rendering.

Open dashboard → Sign up, get a guided first print in ~2 minutes.
14-day free trial, no card Flat monthly plans (CAD) Bridge agent = one Node script At-least-once delivery, 3 attempts

How it works

your app ── POST /v1/jobs ──> printforge cloud <── long-poll ── bridge agent ──> printer
                                (queued)          GET /bridge/v1/jobs?wait=25       (LAN/USB)
                                                  POST /bridge/v1/jobs/:id/ack

Quickstart — first print in 3 calls

# 1. Create an account (starts a 14-day trial)
curl -X POST http://localhost:5102/api/auth/signup \
  -H "content-type: application/json" \
  -d '{"email":"you@company.com","password":"s3cret-pass","companyName":"Acme"}'

# 2. Mint an API key with the returned JWT (shown once!)
curl -X POST http://localhost:5102/api/keys \
  -H "authorization: Bearer $JWT" -H "content-type: application/json" \
  -d '{"name":"production"}'

# 3. Register a printer and queue your first job with the sk_pf_ key
curl -X POST http://localhost:5102/v1/printers \
  -H "authorization: Bearer $API_KEY" -H "content-type: application/json" \
  -d '{"name":"Kitchen","kind":"thermal","widthChars":42}'

curl -X POST http://localhost:5102/v1/jobs \
  -H "authorization: Bearer $API_KEY" -H "content-type: application/json" \
  -d '{"printerId":"PRINTER_ID","contentType":"receipt_json","dedupeKey":"order-1042",
       "content":{"header":"ACME CAFE","lines":[{"name":"Cheeseburger","qty":2,"price":25.98}],
                  "totals":[{"label":"TOTAL","amount":25.98}],"footer":"Thank you!"}}'

Then create a bridge (POST /v1/bridges), run node bridge-agent/agent.js with the returned pfb_ token, and the job lands on paper.

API reference

Dashboard (JWT)

EndpointDescription
POST /api/auth/signupCreate account, start trial, returns JWT
POST /api/auth/loginLogin, returns JWT
GET /api/auth/meCurrent account
POST /api/keysCreate API key (full key shown once)
GET /api/keys · DELETE /api/keys/:idList / revoke keys
GET /api/usageCurrent-month counters vs plan limits
POST /api/billing/checkout · /portal · /webhookStripe (or simulated) subscription management
GET /api/healthService + DB status

Product API (API key sk_pf_...)

EndpointDescription
POST/GET /v1/printers, GET/PATCH/DELETE /v1/printers/:idPrinter CRUD; status derived from heartbeats (90s window)
POST/GET /v1/bridges, DELETE /v1/bridges/:idBridge devices; device token pfb_... shown once
POST /v1/bridges/:id/assignAssign printers to a bridge
POST /v1/jobsQueue a job (escpos_base64 | text | receipt_json, optional dedupeKey)
GET /v1/jobs · /v1/jobs/:idList (filter by state, printerId, paginated) / inspect
POST /v1/jobs/:id/cancelCancel — only while queued
POST /v1/jobs/:id/retryRequeue a failed job (attempts reset)

Bridge API (device token pfb_...)

EndpointDescription
POST /bridge/v1/heartbeatMark device + assigned printers online (optional per-printer statuses)
GET /bridge/v1/jobs?wait=25Long-poll and atomically claim up to 10 queued jobs
POST /bridge/v1/jobs/:id/ackReport printed or failed (auto-requeue below max attempts)

Pricing

Starter

$19 CAD/mo
  • 1,000 print jobs/mo
  • 2 printers
  • Unlimited bridges

Scale

$119 CAD/mo
  • 100,000 print jobs/mo
  • Unlimited printers
  • Unlimited bridges

Every account starts with a 14-day free trial (Starter limits), no card required. All errors use one envelope: {"error":{"code":"...","message":"..."}}.