Cufy API
Documentos

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_sale con 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.

CampoQué esEjemplo
register_idLa placa o código de la caja."CAJA-01"
locationDónde está la caja."Salón principal"
cashierQuién atendió la venta."Cajero de ejemplo"
register_typeQué tipo de caja es."Caja principal"
sale_codeEl 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

POST /v1/pos-receipts
{
  "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) o POST /v1/pos-debit-notes (aumento).
  • original_document_id es el id de un tiquete POS tuyo y validado. Una factura no sirve de original.
  • Usa un rango de tipo pos_credit_note o pos_debit_note, con consecutivo propio: no necesita resolución de la DIAN.
  • El motivo va en discrepancy_reason.code: 1 devolución, 2 anulación, 3 rebaja o descuento, 4 ajuste de precio, 5 otros.

El saldo que queda por ajustar se consulta igual que en una factura, con GET /v1/documents/{id}/credit-balance sobre el tiquete.

POST /v1/pos-credit-notes
{
  "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ódigoQué pasó
NUMBERING_TYPE_MISMATCHMandaste el rango de facturas. El POS necesita uno de tipo pos_equivalent.
ORIGINAL_INVOICE_NOT_VALIDATEDLa nota de ajuste apunta a algo que no es un tiquete POS tuyo y validado.
SIGNING_AUTHORIZATION_BLOCKEDLa autorización de firma del emisor no incluye este tipo de documento.
UNSUPPORTED_OPERATIONLo intentaste en simulation.

En esta página