---
title: "PDF and RAW printer languages"
description: "Choose PDF or an explicit RAW language—ZPL, TSPL, CPCL or ESC/POS—and route each job only to a compatible printer."
---
<nav class="docs-breadcrumb" aria-label="Breadcrumb"><a href="/docs/">CloudPrint Documentation</a><span aria-hidden="true">/</span><span>Print API</span></nav>

# PDF and RAW printer languages

<p class="docs-lead">CloudPrint accepts print-ready PDF and four explicit RAW printer languages: ZPL, TSPL, CPCL and ESC/POS. Your integration declares the document language, the agent discovers what each printer reports, and the API prevents incompatible jobs from being routed.</p>

## Choose the correct input

| Input | `document_format` | `document_raw_language` | Typical use |
| --- | --- | --- | --- |
| PDF | `pdf` | omit | invoices, packing slips and page-based labels |
| ZPL | `raw` | `zpl` | thermal labels |
| TSPL / TSPL-EZ | `raw` | `tspl` | thermal labels |
| CPCL | `raw` | `cpcl` | mobile and compact label printers |
| ESC/POS | `raw` | `escpos` | receipts and point-of-sale printers |

The names in the API are exact enum values. TSPL-EZ devices may report more than one compatible profile; always use a language that the selected printer actually advertises.

## Trust discovered capabilities

Call `GET /api/v1/printers` and inspect `capabilities.language_profiles` together with `endpoint.raw_passthrough_available`. The agent discovers these capabilities from printer-reported data. Do not infer a language from a brand, model or queue name, and do not ask an operator to assign one manually.

## Upload RAW data explicitly

Set both RAW fields and send the original printer commands without rendering:

```bash
RAW_LANGUAGE=tspl
curl -sS https://public-api.cloudprint.me/api/v1/documents \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -F 'file=@label.prn;type=application/octet-stream' \
  -F 'document_format=raw' \
  -F "document_raw_language=$RAW_LANGUAGE"
```

Use `zpl`, `tspl`, `cpcl` or `escpos`. CloudPrint validates the declared language against the selected printer before delivery; it does not translate one printer language into another.

## Keep PDF separate from RAW

Upload a print-ready PDF with `document_format=pdf` and omit `document_raw_language`. A PDF needs system printing or an agent-supported conversion route. Do not label PDF bytes as RAW. The dashboard accepts PDF and the same explicit RAW languages as the API: ZPL, TSPL, CPCL and ESC/POS.

## Test the exact printer and media

Before production, test every printer model, driver or queue, language, DPI and media profile used by the workflow. For a failed job, record `print_job_id`, `X-Request-Id`, failure reason and the advertised capabilities. For poor output, verify the original command data, media size, sensor calibration, darkness and speed on the physical device without logging confidential document contents.

## Next steps

<div class="docs-card-grid"><a class="docs-card" href="/docs/api/documents/"><strong>Upload PDF and RAW documents</strong><span>Choose multipart upload, a public HTTPS URL or Base64, and prepare PDF or RAW printer-language data for CloudPrint.</span></a>
<a class="docs-card" href="/docs/guides/label-printing/"><strong>Print barcode labels through an API</strong><span>Send print-ready barcode, product and warehouse labels as PDF, ZPL, TSPL or CPCL to a compatible local printer.</span></a>
<a class="docs-card" href="/docs/guides/receipt-printing/"><strong>Print ESC/POS receipts from an application</strong><span>Send prepared ESC/POS receipt data from a POS, ecommerce or business application to a compatible local receipt printer.</span></a></div>

<nav class="docs-resource-links" aria-label="Next steps"><a href="https://cloudprint.me/status/">Service status</a><a href="/docs/api/v1/explorer/">OpenAPI</a><a href="https://developer.cloudprint.me">Developer Portal</a><a href="https://my.cloudprint.me">Open account</a><a href="/docs/legal/privacy/">Privacy Policy</a><a href="/docs/legal/terms/">Terms</a><a href="/docs/legal/data-processing/">DPA</a><a href="/docs/legal/service-level-agreement/">Service Level Agreement</a></nav>