Skip to navigation

Registrar una venta cobrada en efectivo

Registra una venta cobrada en efectivo. No mueve dinero por Recurrente: no se descuenta comisión, no impacta el balance del merchant, y no se genera transacción en el ledger. Si pasas tax_id, se intenta emitir la factura electrónica (DTE) automáticamente.

Puedes enviar customer_id para reutilizar un cliente creado con POST /customers, conservando su nombre y correo en el registro de la venta. Debe pertenecer a la cuenta seleccionada y al entorno de la llave. Si omites tax_id, se usa el nit guardado en ese cliente; un tax_id explícito tiene prioridad solo para esta venta, sin modificar al cliente. Con NIT y facturación configurada, se intenta emitir el DTE. El nombre fiscal sigue la validación habitual del NIT, igual que en un checkout; no se sustituye el nombre devuelto por SAT con texto libre. El correo se conserva en el cliente, pero no se envía en el XML de la FEL. Si omites customer_id, se mantiene la venta anónima existente. Con una llave TEST heredada solo son visibles los clientes que ya aparecen en un checkout de prueba; para probar el flujo completo usa una llave de Sandbox.

Un 201 confirma el registro de la venta, no la certificación del DTE: si la emisión falla o el certificador no responde, la venta queda registrada igual y el intento del DTE se reintenta por su cuenta. Consulta GET /intents/{id} para el estado actual. Si tu cuenta factura fuera de Recurrente no emitimos el DTE, aunque envíes NIT: el NIT queda guardado en la venta y la factura la emites tú.

Envía Idempotency-Key para reintentos seguros: si pierdes la respuesta después de registrar la venta, repetir el mismo request con la misma clave devuelve la respuesta original en vez de registrar una segunda venta y emitir un segundo DTE.

La respuesta devuelve el ID del recurso unificado (in_…). Persiste ese ID para reconciliar el evento intent.succeeded y para consultar el estado actual mediante GET /intents/{id}. También aparece como checkout.latest_intent.id; solo el id superior del evento legacy cash_intent.succeeded usa el ID concreto del CashIntent (ca_…).

tax_invoice_url en los webhooks refleja el estado del DTE al momento de la entrega. Puede ser null si la emisión todavía no concluyó o falló y luego se recupera. Ese cambio no genera un segundo webhook de éxito; recupera la URL actual con GET /intents/{id}.

Si operas una plataforma, envía X-ACCOUNT-ID tanto al crear como al consultar para que la venta y su DTE pertenezcan a la cuenta conectada y se emitan bajo su NIT. X-CUSTOM-ACCOUNT-ID no selecciona el contexto de lectura.

Authentication

X-SECRET-KEYstring

Tu clave secreta de API.

Una llave de cuenta (sk_live_..., sk_test_...) opera sobre su propia cuenta y, con X-ACCOUNT-ID, sobre sus cuentas conectadas.

La llave también fija el ambiente: una sk_test_ solo lista y resuelve objetos de prueba (live_mode: false) y una sk_live_ solo objetos reales. Un ID del otro ambiente responde 404 (401 en /customers).

Una llave de organización (sk_org_live_..., sk_org_test_...) alcanza todas las cuentas de una organización y solo sirve para leer: saldos, movimientos y reportes. Para operar sobre una cuenta debe nombrarla con X-ACCOUNT-ID; omitirlo en una lectura devuelve todas las cuentas de la organización. Cualquier otro endpoint responde 403 con code: organization_key_unsupported.

Headers

Idempotency-KeystringOptional

Clave de idempotencia para reintentos seguros de operaciones críticas, especialmente las que mueven dinero o cambian estado operativo. Reintentar con la misma clave y el mismo cuerpo devuelve la respuesta original (header Idempotency-Replayed: true); reusarla con parámetros distintos devuelve 409.

Request

This endpoint expects an object.
amount_in_centsintegerRequired
Monto en centavos
currencyenumOptional

Moneda. Default — la moneda principal de la cuenta.

Allowed values:
descriptionstringOptional

(Opcional) Descripción visible en el recibo y la actividad

customer_idstringOptional

(Opcional) ID público del cliente de esta cuenta y entorno. Reutiliza su nombre, correo y NIT; no crea otro cliente ni realiza un cobro electrónico.

tax_idstringOptional

(Opcional) NIT para esta venta; tiene prioridad sobre el nit del customer_id. Si existe un NIT y la cuenta tiene facturación electrónica configurada, se intenta emitir el DTE automáticamente.

Response

Venta en efectivo registrada (no confirma la certificación del DTE)

idstringOptionalformat: "^in_"

ID del intent unificado. Úsalo con GET /intents/{id} y con el id superior de los eventos intent.*.

statusstringOptional
amount_in_centsintegerOptional
currencystringOptional
descriptionstringOptional
tax_idstring or nullOptional
created_atdatetimeOptional

Errors

400
Bad Request Error
401
Unauthorized Error
404
Not Found Error
422
Unprocessable Entity Error