Documento equivalente POS
El tiquete POS electrónico y sus notas de ajuste. Qué cambia frente a una factura y un ejemplo completo de cada uno.
El documento equivalente electrónico POS es el tiquete que entrega una caja registradora. Para un restaurante o una tienda es el documento de la mayoría de las ventas: el comprador no pide factura y se lleva un tiquete.
Se envía casi igual que una factura. Cambian cuatro cosas:
- Va a
POST /v1/pos-receipts, no a/v1/invoices. - Usa su propio rango de numeración, de tipo
pos_equivalent. No sirve el de facturas. - Lleva un bloque
point_of_salecon los datos de la caja que lo expide. - Se identifica con un CUDE, no con un CUFE. Te llega en
signature.cude.
Solo en el ambiente de habilitación
El POS se emite en qualification, el ambiente de pruebas ante la DIAN. En simulation responde 422 UNSUPPORTED_OPERATION.
La caja que lo expide
point_of_sale es obligatorio. La DIAN lo exige aunque su anexo lo describa como opcional: un tiquete sin estos datos se rechaza.
| Campo | Qué es | Ejemplo |
|---|---|---|
register_id | La placa o código de la caja. | "CAJA-01" |
location | Dónde está la caja. | "Salón principal" |
cashier | Quién atendió la venta. | "Cajero de ejemplo" |
register_type | Qué tipo de caja es. | "Caja principal" |
sale_code | El código de la venta en tu sistema. | "VENTA-000123" |
buyer_benefits es opcional: los puntos de un programa de fidelización. Si no lo mandas, el tiquete lleva la identificación y el nombre del comprador con cero puntos.
Comprador
En un tiquete lo habitual es no identificar al cliente: usa el consumidor final (party_type: "final_consumer", identificación 222222222222). Si el cliente da su cédula, va como un comprador person normal. El tiquete nunca lleva la dirección del comprador.
Pago
El tiquete POS es siempre de contado: payment.terms tiene que ser cash. Puedes declarar varios medios de pago, igual que en una factura.
Ejemplo completo
{
"document_type": "pos_equivalent",
"external_reference": "DEMO-POS-001",
"profile_id": "co-pos-equivalent-cop-v1",
"numbering_range_id": "00000000-0000-4000-8000-000000000013",
"issued_at": "2026-09-10T13:30:00-05:00",
"currency": "COP",
"buyer": {
"party_type": "person",
"identification": {
"type_code": "13",
"number": "1000000000"
},
"name": "Comprador de ejemplo",
"email": "comprador@example.com",
"tax_registration": {
"responsibility_codes": [
"R-99-PN"
],
"tax_scheme_codes": [
"01"
]
}
},
"lines": [
{
"id": "1",
"description": "Bandeja paisa, datos ficticios",
"product_identification": {
"scheme_code": "999",
"value": "DEMO-POS-001"
},
"quantity": "2",
"unit_code": "94",
"unit_price": "32000.00",
"price_base_quantity": "1",
"net_amount": "64000.00",
"adjustments": [],
"taxes": [
{
"code": "01",
"rate": "19",
"taxable_amount": "64000.00",
"amount": "12160.00"
}
],
"withholdings": []
},
{
"id": "2",
"description": "Limonada de coco, datos ficticios",
"product_identification": {
"scheme_code": "999",
"value": "DEMO-POS-002"
},
"quantity": "2",
"unit_code": "94",
"unit_price": "9000.00",
"price_base_quantity": "1",
"net_amount": "18000.00",
"adjustments": [],
"taxes": [
{
"code": "01",
"rate": "19",
"taxable_amount": "18000.00",
"amount": "3420.00"
}
],
"withholdings": []
}
],
"adjustments": [],
"tax_totals": [
{
"code": "01",
"rate": "19",
"taxable_amount": "82000.00",
"amount": "15580.00"
}
],
"withholding_totals": [],
"totals": {
"line_extension_amount": "82000.00",
"tax_exclusive_amount": "82000.00",
"tax_inclusive_amount": "97580.00",
"allowance_total_amount": "0.00",
"charge_total_amount": "0.00",
"prepaid_amount": "0.00",
"payable_rounding_amount": "0.00",
"payable_amount": "97580.00"
},
"payment": {
"terms": "cash",
"means_code": "10"
},
"delivery": {
"mode": "cufy_email",
"recipients": [
"comprador@example.com"
]
},
"point_of_sale": {
"register_id": "CAJA-01",
"location": "Salón principal",
"cashier": "Cajero de ejemplo",
"register_type": "Caja principal",
"sale_code": "VENTA-000123"
}
}La respuesta es un 202 con el document_id, igual que una factura. El número sale de tu rango POS (por ejemplo, EPOS42) y lo ves en fiscal_identity cuando el documento termina.
Notas de ajuste
Un tiquete validado tampoco se edita. Se corrige con una nota de ajuste, que es distinta de la nota crédito de factura:
- Va a
POST /v1/pos-credit-notes(rebaja) oPOST /v1/pos-debit-notes(aumento). original_document_ides elidde un tiquete POS tuyo y validado. Una factura no sirve de original.- Usa un rango de tipo
pos_credit_noteopos_debit_note, con consecutivo propio: no necesita resolución de la DIAN. - El motivo va en
discrepancy_reason.code:1devolución,2anulación,3rebaja o descuento,4ajuste de precio,5otros.
El saldo que queda por ajustar se consulta igual que en una factura, con GET /v1/documents/{id}/credit-balance sobre el tiquete.
{
"document_type": "pos_credit_note",
"external_reference": "DEMO-POS-CREDIT-001",
"profile_id": "co-pos-adjustment-cop-v1",
"numbering_range_id": "00000000-0000-4000-8000-000000000014",
"issued_at": "2026-09-11T09:00:00-05:00",
"currency": "COP",
"buyer": {
"party_type": "person",
"identification": {
"type_code": "13",
"number": "1000000000"
},
"name": "Comprador de ejemplo",
"email": "comprador@example.com",
"tax_registration": {
"responsibility_codes": [
"R-99-PN"
],
"tax_scheme_codes": [
"01"
]
}
},
"lines": [
{
"id": "1",
"description": "Bandeja paisa, datos ficticios",
"product_identification": {
"scheme_code": "999",
"value": "DEMO-POS-001"
},
"quantity": "2",
"unit_code": "94",
"unit_price": "32000.00",
"price_base_quantity": "1",
"net_amount": "64000.00",
"adjustments": [],
"taxes": [
{
"code": "01",
"rate": "19",
"taxable_amount": "64000.00",
"amount": "12160.00"
}
],
"withholdings": [],
"original_line_id": "1"
},
{
"id": "2",
"description": "Limonada de coco, datos ficticios",
"product_identification": {
"scheme_code": "999",
"value": "DEMO-POS-002"
},
"quantity": "2",
"unit_code": "94",
"unit_price": "9000.00",
"price_base_quantity": "1",
"net_amount": "18000.00",
"adjustments": [],
"taxes": [
{
"code": "01",
"rate": "19",
"taxable_amount": "18000.00",
"amount": "3420.00"
}
],
"withholdings": [],
"original_line_id": "2"
}
],
"adjustments": [],
"tax_totals": [
{
"code": "01",
"rate": "19",
"taxable_amount": "82000.00",
"amount": "15580.00"
}
],
"withholding_totals": [],
"totals": {
"line_extension_amount": "82000.00",
"tax_exclusive_amount": "82000.00",
"tax_inclusive_amount": "97580.00",
"allowance_total_amount": "0.00",
"charge_total_amount": "0.00",
"prepaid_amount": "0.00",
"payable_rounding_amount": "0.00",
"payable_amount": "97580.00"
},
"payment": {
"terms": "cash",
"means_code": "10"
},
"delivery": {
"mode": "cufy_email",
"recipients": [
"comprador@example.com"
]
},
"point_of_sale": {
"register_id": "CAJA-01",
"location": "Salón principal",
"cashier": "Cajero de ejemplo",
"register_type": "Caja principal",
"sale_code": "VENTA-000123"
},
"original_document_id": "00000000-0000-4000-8000-000000000022",
"discrepancy_reason": {
"code": "2",
"description": "Anulación de un tiquete P.O.S. de ejemplo"
},
"adjustment_scope": "total"
}Errores que vas a ver
| Código | Qué pasó |
|---|---|
NUMBERING_TYPE_MISMATCH | Mandaste el rango de facturas. El POS necesita uno de tipo pos_equivalent. |
ORIGINAL_INVOICE_NOT_VALIDATED | La nota de ajuste apunta a algo que no es un tiquete POS tuyo y validado. |
SIGNING_AUTHORIZATION_BLOCKED | La autorización de firma del emisor no incluye este tipo de documento. |
UNSUPPORTED_OPERATION | Lo intentaste en simulation. |