---
title: "Imprimir un comprobante en una terminal"
method: POST
path: "/terminal_print_commands"
tags: ["terminalPrintCommands"]
---

# Imprimir un comprobante en una terminal

`POST /terminal_print_commands`

## Request

- Base URL: `https://app.recurrente.com/api`
- URL: `https://app.recurrente.com/api/terminal_print_commands`
- Auth: API key in header `X-SECRET-KEY`
- TypeScript: <https://skmtc.dev/recurrente/apis/referencia-api/docs/terminal_print_commands/post.ts> (a function with typed inputs; its response is checked against the schema)

Manda una copia del comprobante de una venta ya pagada a la impresora de la terminal donde se hizo. La terminal imprime sin salir de **Modo espera**, así que el siguiente cobro entra igual.

Esto separa la impresión del cobro: `print_receipt` en `POST /api/terminal_session_commands` imprime la copia del cliente en automático al aprobar; este endpoint imprime cualquier copia, de cualquier venta anterior, cuando tu sistema lo pida.

### Caso típico

El cajero cobra con `print_receipt: true` y `show_post_payment_screens: false`: sale la copia del cliente y la terminal vuelve a Modo espera. Cuando el cajero ya cortó ese papel, tu sistema manda `POST /api/terminal_print_commands` con `copy: "merchant"` y sale la copia del comercio.

### Reglas

- El `checkout_id` viene de la respuesta del comando de cobro. La venta debe estar pagada (`sale_not_paid` si no) y haberse hecho en esa misma terminal (`sale_on_another_terminal` si no).
- `copy` elige la copia: `merchant` (la del comercio, el default) o `customer`.
- `duplicate: true` imprime **DUPLICADO** en el papel. Úsalo cuando reimprimes una copia que ya salió, para que el papel no se lea como una venta distinta.
- Una venta reembolsada imprime el comprobante del reembolso.
- La entrega es best-effort y llega a una terminal en Modo espera; una terminal ocupada la levanta cuando vuelve, dentro de los 10 minutos siguientes. El resultado de impresión no se expone por API y nunca afecta el estado financiero del pago.

### Idempotencia

Manda un `external_id` propio y el mismo request no imprime dos veces: el segundo retorna el comando original con `200` en vez de `201`.

## Request body

- object
  - `terminal_id` string, required: ID público de la terminal (`trm_...`). Lo obtienes en el panel, en **POS → detalle de la terminal**.
  - `checkout_id` string, required: ID del checkout de la venta a imprimir (`ch_...`), tal como viene en la respuesta del comando de cobro.
  - `copy` 'merchant' | 'customer': Cuál copia imprimir.
  - `duplicate` boolean: Marca el papel como **DUPLICADO**. Úsalo al reimprimir una copia que ya salió.
  - `external_id` string: ID único de tu sistema para esta impresión dentro de la cuenta autenticada. Se usa para idempotencia.

## Response `200`

Ya existía un comando con ese `external_id`; se retorna el original

- TerminalPrintCommand
  - `id` string: ID público del comando de impresión
  - `external_id` string, nullable: ID de tu sistema enviado al crear el comando, o `null` si no se envió uno
  - `terminal_id` string: ID de la terminal POS que imprime
  - `checkout_id` string: ID del checkout de la venta impresa
  - `copy` 'merchant' | 'customer': Cuál copia se mandó a imprimir
  - `duplicate` boolean: Indica si el papel sale marcado como DUPLICADO
  - `created_at` string, date-time: Momento en que se creó el comando

## Other responses

- `403`: Se requiere una llave LIVE para una terminal física
- `404`: La terminal no está asociada a la cuenta autenticada
- `422`: La venta no se puede imprimir: `sale_not_found`, `sale_not_paid` o `sale_on_another_terminal`

## Changes

- **2026-09-19** `33bad9197d59`: 6 breaking
  - added `#/components/schemas/ErrorErrors0` to the `errors` response property `oneOf` list for the response status `403`
  - added `#/components/schemas/ErrorErrors0` to the `errors` response property `oneOf` list for the response status `404`
  - added `#/components/schemas/ErrorErrors0` to the `errors` response property `oneOf` list for the response status `422`
  - the `errors/oneOf[subschema #1 -> subschema #2]/` response's property type changed from `object` to `array` for status `403`
  - …2 more
- **2026-09-17** `3d76463f9fd8`: 1 warning, 1 info
  - deleted the `header` request parameter `X-SECRET-KEY`
  - the endpoint scheme security `secretKey` was added to the API
- **2026-09-16** `3389210172a9`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/recurrente/apis/referencia-api/changes/terminal_print_commands/post.md)

---

[API](https://skmtc.dev/recurrente/apis/referencia-api.md) - [All operations](https://skmtc.dev/recurrente/apis/referencia-api/llms.txt) - [OpenAPI document](https://skmtc.dev/recurrente/apis/referencia-api/revisions/1a3fc480dd94?raw)
