Ir al contenido

Objetos

Esta página lista cada objeto del contrato de la API, generada desde el mismo archivo OpenAPI que publica el servidor. En cada endpoint de la referencia verás estos objetos en contexto.

  • En los objetos que devuelve la API, Requerido: Sí significa que el campo siempre viene en la respuesta (aunque su valor pueda ser null).
  • En los objetos que envías (…Create, …Update), Requerido: Sí significa que debes enviarlo.
  • Los montos son pesos colombianos (COP) enteros y las tarifas de impuesto, porcentajes enteros. Mira Cómo se sincroniza con las cajas.

31 objetos en el contrato Posdata API 1.0.0: Error, Scope, Account, ProductVariant, Product, Category, Customer, Warehouse, StockMovement, LineTax, TaxBreakdownEntry, DocumentType, InvoiceSummary, SaleItem, Sale, Invoice, QuoteItem, Quote, CashMovement, CashSession, DailySalesDay, DailySalesReport, Event, CategoryCreate, CategoryUpdate, ProductCreate, ProductUpdate, VariantUpdate, CustomerCreate, CustomerUpdate, StockMovementCreate.

Error

CampoTipoRequeridoDescripción
errorobjectSí
error.codestringSíValores: UNAUTHENTICATED, INVALID_API_KEY, API_KEY_REVOKED, API_KEY_EXPIRED, API_KEY_WRONG_ENVIRONMENT, ACCOUNT_INACTIVE, PLAN_REQUIRED, INSUFFICIENT_SCOPE, BROWSER_REQUESTS_NOT_ALLOWED, VALIDATION_ERROR, INVALID_JSON, PAYLOAD_TOO_LARGE, INVALID_CURSOR, NOT_FOUND, ROUTE_NOT_FOUND, IDEMPOTENCY_KEY_REQUIRED, IDEMPOTENCY_KEY_REUSED, IDEMPOTENCY_IN_PROGRESS, CONFLICT, SKU_ALREADY_EXISTS, VARIANT_STOCK_UNSUPPORTED, COMPOSITE_STOCK_UNSUPPORTED, NO_WAREHOUSE, DEVICES_OUTDATED, RATE_LIMITED, INTERNAL_ERROR.
error.messagestringSíExplicación en español, con el siguiente paso.
error.paramstringNoCampo que causó el error, si aplica.
error.request_idstringSí

Scope

- products:read: Leer productos, variantes y categorías
- products:write: Crear y editar productos, editar variantes, crear y editar categorías
- customers:read: Leer clientes
- customers:write: Crear y editar clientes
- inventory:read: Leer bodegas y movimientos de inventario
- inventory:write: Registrar movimientos de inventario
- sales:read: Leer ventas
- invoices:read: Leer documentos electrónicos (DIAN)
- quotes:read: Leer cotizaciones
- cash:read: Leer turnos y movimientos de caja
- reports:read: Leer reportes agregados
- events:read: Leer el registro de eventos

Valores posibles: products:read, products:write, customers:read, customers:write, inventory:read, inventory:write, sales:read, invoices:read, quotes:read, cash:read, reports:read, events:read

Account

CampoTipoRequeridoDescripción
object"account"Sí
idstring (uuid)SíId de la cuenta (tenant).
businessobject | nullSí
business.namestringNo
business.currencystringNo
planstringSíValores: free, plus, pro.
api_keyobject | nullSí
api_key.idstring (uuid)No
api_key.namestringNo
api_key.environmentstringNoValores: live, test.
api_key.scopesarreglo de ScopeNo
api_key.expires_atstring (date-time) | nullNo
data_freshnessobjectSíLa API lee lo que las cajas ya subieron. last_sync_at es el último cambio que cada caja subió de verdad (null si nunca subió nada): si una caja lleva horas sin subir, sus ventas recientes todavía no aparecen.
data_freshness.last_device_sync_atstring (date-time) | nullNo
data_freshness.devicesarreglo de objectNo
data_freshness.devices[].namestring | nullNo
data_freshness.devices[].kindstringNoValores: primary, satellite, kitchen.
data_freshness.devices[].platformstring | nullNo
data_freshness.devices[].last_sync_atstring (date-time) | nullNo

ProductVariant

Variante de un producto. Precios en pesos enteros, digitados como los digita el negocio: con impuestos incluidos cuando su perfil fiscal dice pricesIncludeTax (lo normal), antes de impuestos si no.

CampoTipoRequeridoDescripción
object"product_variant"Sí
idstring (uuid)Sí
product_idstring (uuid)Sí
labelstringSíNombre de la variante ("Talla M / Rojo").
skustring | nullSí
base_priceintegerSíPrecio de lista, antes del descuento propio del producto.
final_priceintegerSíPrecio al que el POS vende esta variante. Si es 0 en la variante, el POS usa el del producto.
percent_discountnumberSíDescuento del producto sobre base_price, en porcentaje (0-100, puede tener decimales).
imagesarreglo de string (uri)Sí
is_defaultbooleanSí
activebooleanSí
created_atstring (date-time)Sí
updated_atstring (date-time)Sí

Product

Producto del catálogo. Precios en pesos enteros, digitados como los digita el negocio: con impuestos incluidos cuando su perfil fiscal dice pricesIncludeTax (lo normal), antes de impuestos si no.

CampoTipoRequeridoDescripción
object"product"Sí
idstring (uuid)Sí
namestringSí
descriptionstringSí
description_shortstringSí
skustring | nullSíSKU del producto (null si no tiene).
category_idstring (uuid) | nullSí
kindstringSícomposite = se arma desde una receta y no descuenta su propio stock. Valores: simple, composite.
sellablebooleanSífalse = insumo que no se vende por sí solo.
activebooleanSí
tax_classstringSíClase fiscal del ítem. standard hereda del perfil fiscal del negocio. Valores: standard, reduced_5, excluded, exempt, service_19, event_package, bag, passthrough.
base_priceintegerSíPrecio de lista, antes del descuento propio del producto.
final_priceintegerSíPrecio al que el POS vende. Si el producto no tiene descuento es igual a base_price.
percent_discountnumberSíDescuento del producto sobre base_price, en porcentaje (0-100, puede tener decimales).
base_unitstringSíUnidad base (und, g, kg, lb, oz, ml, l, doc). Stock y costo se expresan en ella.
sold_by_weightbooleanSíSe vende por peso: la cantidad de la línea es un peso en base_unit.
stockinteger | nullSíExistencias en base_unit. **Hoy siempre es null**: todavía no publicamos un número de stock porque no podemos garantizar que coincida con el de las cajas (lo activaremos cuando lo esté). Para mover stock usa POST /inventory/movements; para leer el historial, GET /inventory/movements.
unit_costnumberSíCosto promedio ponderado por unidad base (informativo).
image_urlstring (uri) | nullSí
imagesarreglo de string (uri)Sí
has_variantsbooleanSí
variantsarreglo de ProductVariantSíVariantes vigentes (no eliminadas).
deleted_atstring (date-time) | nullSí
created_atstring (date-time)Sí
updated_atstring (date-time)Sí

Category

Categoría del catálogo.

CampoTipoRequeridoDescripción
object"category"Sí
idstring (uuid)Sí
namestringSí
descriptionstring | nullSí
image_urlstring (uri) | nullSí
sort_orderintegerSí
deleted_atstring (date-time) | nullSí
created_atstring (date-time)Sí
updated_atstring (date-time)Sí

Customer

Cliente del negocio.

CampoTipoRequeridoDescripción
object"customer"Sí
idstring (uuid)Sí
namestringSí
last_namestring | nullSí
emailstring | nullSí
phonestring | nullSí
person_typestringSíperson (persona natural) o company (persona jurídica).
document_typestringSíTipo de identificación: CC, TI, NIT, CE, PASAPORTE.
document_numberstring | nullSí
contact_channelstring | nullSíCómo llegó el cliente: none, store, whatsapp, instagram, website, referral.
deleted_atstring (date-time) | nullSí
created_atstring (date-time)Sí
updated_atstring (date-time)Sí

Warehouse

Bodega del negocio.

CampoTipoRequeridoDescripción
object"warehouse"Sí
idstring (uuid)Sí
namestringSí
addressstring | nullSí
citystring | nullSí
is_defaultbooleanSí
activebooleanSí
created_atstring (date-time)Sí
updated_atstring (date-time)Sí

StockMovement

Movimiento del libro de inventario (solo se agregan, nunca se editan).

CampoTipoRequeridoDescripción
object"stock_movement"Sí
idstring (uuid)Sí
product_idstring (uuid)Sí
variant_idstring (uuid) | nullSí
warehouse_idstring (uuid) | nullSínull si el movimiento llegó antes que su bodega.
typestringSíTipo de movimiento tal como lo registró la caja.
quantitynumberSíCantidad en la unidad base del producto (puede ser fraccionaria).
reasonstring | nullSí
referencestring | nullSíReferencia libre del movimiento.
unit_costnumber | nullSíCosto por unidad base al momento del movimiento.
origin_typestring | nullSísale, purchase, adjustment, recipe_explosion, reversal.
sale_idstring (uuid) | nullSíLa venta que causó el movimiento, si aplica.
created_atstring (date-time)Sí
updated_atstring (date-time)Sí

LineTax

Impuesto cobrado en una línea, congelado al momento de la venta.

CampoTipoRequeridoDescripción
codestringSíCódigo DIAN del tributo: 01 IVA, 03 ICA, 04 INC, 22 INC bolsas.
namestring | nullSí
ratenumber | nullSíTarifa en PORCENTAJE entero (19 = 19 %), tal como se cobró. null en impuestos por unidad.
per_unitinteger | nullSíValor fijo por unidad (bolsas). null en impuestos por porcentaje.
baseintegerSíPesos colombianos (COP), entero sin decimales.
amountintegerSíPesos colombianos (COP), entero sin decimales.

TaxBreakdownEntry

Total de un tributo en el documento, agrupado por (código, tarifa).

CampoTipoRequeridoDescripción
codestringSí
ratenumber | nullSíPorcentaje entero.
per_unitinteger | nullSí
baseintegerSíPesos colombianos (COP), entero sin decimales.
amountintegerSíPesos colombianos (COP), entero sin decimales.

DocumentType

electronic_invoice = factura electrónica (DIAN 1, CUFE) · pos_document = documento equivalente POS electrónico (DIAN 15, CUDE) · pos_adjustment_note = nota de ajuste del documento POS (DIAN 26) · internal_invoice = factura no electrónica.

Valores posibles: electronic_invoice, pos_document, pos_adjustment_note, internal_invoice, other

InvoiceSummary

Resumen de un documento de la venta. El detalle está en GET /invoices/{id}.

CampoTipoRequeridoDescripción
idstring (uuid)Sí
document_typeDocumentTypeSí
statusstringSí
cufestring | nullSíCUFE (factura) o CUDE (documento POS).
prefixstring | nullSí
numberintegerSí

SaleItem

Línea de una venta.

CampoTipoRequeridoDescripción
object"sale_item"Sí
idstring (uuid)Sí
product_idstring (uuid) | nullSínull en líneas libres o si el producto ya no existe.
variant_idstring (uuid) | nullSí
item_kindstringSíproduct o una línea libre.
descriptionstring | nullSí
quantitynumberSíPuede ser fraccionaria (ventas por peso).
unit_priceintegerSíPrecio unitario con los impuestos porcentuales incluidos.
subtotalintegerSíTotal de la línea con impuestos incluidos.
unit_costnumber | nullSíCosto unitario congelado al vender.
tax_classstringSí
taxesarreglo de LineTax | nullSínull en líneas antiguas sin impuestos congelados.

Sale

Venta. Ingreso neto = total - tax - tip_amount.

CampoTipoRequeridoDescripción
object"sale"Sí
idstring (uuid)Sí
statusstringSíEstado tal como lo registró el POS (completed, cancelled, open, pending…).
document_kindstringSíDocumento que pidió el POS al cobrar. Valores: pos, invoice.
payment_methodstringSíMedio de pago tal como lo registró el POS (CASH, CARD, NEQUI…).
customer_idstring (uuid) | nullSí
cash_session_idstring (uuid) | nullSí
subtotalintegerSíSuma de las líneas, impuestos incluidos.
discountintegerSíPesos colombianos (COP), entero sin decimales.
discount_percentnumberSí
taxintegerSíParte del total que es impuesto.
tip_amountintegerSíPropina. Nunca es base gravable.
totalintegerSísubtotal - discount + tip_amount.
tax_breakdownarreglo de TaxBreakdownEntry | nullSí
notesstring | nullSí
table_labelstring | nullSí
itemsarreglo de SaleItemSí
invoicesarreglo de InvoiceSummarySí
occurred_atstring (date-time)SíCuando se registró la venta en la caja (reloj de la caja). En ventas sincronizadas antes del 28-sep-2026 es la hora de llegada.
created_atstring (date-time)SíCuando la venta llegó al servidor (una caja sin conexión la sube después).
updated_atstring (date-time)Sí

Invoice

Documento de una venta (electrónico ante la DIAN o interno). El PDF/XML no se publican por la API en v1.

CampoTipoRequeridoDescripción
object"invoice"Sí
idstring (uuid)Sí
sale_idstring (uuid) | nullSí
document_typeDocumentTypeSí
type_document_idinteger | nullSíCódigo del tipo de documento DIAN (1, 15, 26).
statusstringSípending, issued, rejected, emission_failed, annulled.
dian_statusstring | nullSí
dian_messagestring | nullSíMensaje de la DIAN; solo cuando el documento fue emitido o rechazado.
document_reasonstring | nullSíPor qué se eligió este tipo de documento.
prefixstring | nullSí
numberintegerSí
cufestring | nullSíCUFE (factura) o CUDE (documento POS).
subtotalintegerSíPesos colombianos (COP), entero sin decimales.
taxintegerSíPesos colombianos (COP), entero sin decimales.
totalintegerSíPesos colombianos (COP), entero sin decimales.
issued_atstring (date-time)Sí
created_atstring (date-time)Sí
updated_atstring (date-time)Sí

QuoteItem

Línea de una cotización.

CampoTipoRequeridoDescripción
object"quote_item"Sí
idstring (uuid)Sí
product_idstring (uuid) | nullSí
variant_idstring (uuid) | nullSí
item_kindstringSí
descriptionstring | nullSí
quantitynumberSí
unit_priceintegerSíCon impuestos porcentuales incluidos.
subtotalintegerSíPesos colombianos (COP), entero sin decimales.
tax_classstringSí
taxesarreglo de LineTax | nullSí
notestring | nullSí

Quote

Cotización.

CampoTipoRequeridoDescripción
object"quote"Sí
idstring (uuid)Sí
numberstring | nullSíCOT-XXXX; solo existe cuando la cotización se envió.
statusstringSídraft, sent, accepted, rejected, expired, converted. El vencimiento lo aplica la app al leer: compara con expires_at.
customer_idstring (uuid) | nullSí
converted_sale_idstring (uuid) | nullSí
subtotalintegerSíPesos colombianos (COP), entero sin decimales.
discountintegerSíPesos colombianos (COP), entero sin decimales.
taxintegerSíPesos colombianos (COP), entero sin decimales.
totalintegerSíPesos colombianos (COP), entero sin decimales.
tax_breakdownarreglo de TaxBreakdownEntry | nullSí
notesstring | nullSí
payment_linkstring | nullSí
expires_atstring (date-time) | nullSí
sent_atstring (date-time) | nullSí
itemsarreglo de QuoteItemSí
created_atstring (date-time)Sí
updated_atstring (date-time)Sí

CashMovement

Entrada o salida manual de efectivo del cajón.

CampoTipoRequeridoDescripción
object"cash_movement"Sí
idstring (uuid)Sí
typestringSíValores: in, out.
amountintegerSíPesos colombianos (COP), entero sin decimales.
reasonstring | nullSí
created_atstring (date-time)Sí

CashSession

Turno de caja con sus movimientos de efectivo.

CampoTipoRequeridoDescripción
object"cash_session"Sí
idstring (uuid)Sí
statusstringSíopen, closed, suspended.
terminal_namestringSíNombre de la caja ("Caja 01").
opening_cashintegerSíPesos colombianos (COP), entero sin decimales.
expected_cashinteger | nullSíLo que la app calculó que debía haber al cerrar.
closing_cashinteger | nullSíLo que se contó al cerrar.
opened_atstring (date-time)Sí
closed_atstring (date-time) | nullSí
movementsarreglo de CashMovementSí
created_atstring (date-time)Sí
updated_atstring (date-time)Sí

DailySalesDay

Totales de un día (hora de Bogotá).

CampoTipoRequeridoDescripción
datestring (date)Sí
sales_countintegerSíNúmero de ventas completadas.
subtotalintegerSíPesos colombianos (COP), entero sin decimales.
discountintegerSíPesos colombianos (COP), entero sin decimales.
taxintegerSíPesos colombianos (COP), entero sin decimales.
tip_amountintegerSíPesos colombianos (COP), entero sin decimales.
totalintegerSíPesos colombianos (COP), entero sin decimales.

DailySalesReport

Ventas completadas por día calendario de Bogotá. Una venta cuenta en el día en que se registró en la caja (occurred_at); las sincronizadas antes del 28-sep-2026 cuentan en el día en que llegaron al servidor.

CampoTipoRequeridoDescripción
object"daily_sales_report"Sí
timezone"America/Bogota"Sí
currency"COP"Sí
fromstring (date)Sí
tostring (date)Sí
daysarreglo de DailySalesDaySíUn elemento por día del rango, incluidos los días sin ventas (en cero).
totalsobjectSí
totals.sales_countintegerSíNúmero de ventas completadas.
totals.subtotalintegerSíPesos colombianos (COP), entero sin decimales.
totals.discountintegerSíPesos colombianos (COP), entero sin decimales.
totals.taxintegerSíPesos colombianos (COP), entero sin decimales.
totals.tip_amountintegerSíPesos colombianos (COP), entero sin decimales.
totals.totalintegerSíPesos colombianos (COP), entero sin decimales.

Event

Evento del registro de webhooks. Sirve para reconciliar entregas perdidas.

CampoTipoRequeridoDescripción
object"event"Sí
idstring (uuid)Sí
typestringSíTipo de evento, por ejemplo sale.completed.
created_atstring (date-time)Sí
dataobjectSí
data.objectobjectSíEl objeto (venta, producto…) tal como era cuando ocurrió el evento.

CategoryCreate

Un campo que no esté en la lista se rechaza con VALIDATION_ERROR.

CampoTipoRequeridoDescripción
namestringSíMáximo 120 caracteres.
descriptionstringNoMáximo 1000 caracteres.
sort_orderintegerNoMínimo 0. Máximo 100000.

CategoryUpdate

Envía al menos 1 campo.

Un campo que no esté en la lista se rechaza con VALIDATION_ERROR.

CampoTipoRequeridoDescripción
namestringNoMáximo 120 caracteres.
descriptionstringNoMáximo 1000 caracteres.
sort_orderintegerNoMínimo 0. Máximo 100000.

ProductCreate

Un campo que no esté en la lista se rechaza con VALIDATION_ERROR.

CampoTipoRequeridoDescripción
namestringSíMáximo 200 caracteres.
descriptionstringNoMáximo 5000 caracteres.
description_shortstringNoMáximo 300 caracteres.
skustringNoMáximo 60 caracteres.
category_idstring (uuid) | nullNo
base_priceintegerSíPrecio base en pesos. Mínimo 0. Máximo 10000000000.
final_priceintegerNoPrecio al que vende la caja. Si no se envía, es igual a base_price. Mínimo 0. Máximo 10000000000.
percent_discountnumberNoMínimo 0. Máximo 100.
tax_classstringNoClase fiscal del ítem. standard hereda del perfil fiscal del negocio. Valores: standard, reduced_5, excluded, exempt, service_19, event_package, bag, passthrough. Por defecto "standard".
activebooleanNoPor defecto true.
sellablebooleanNofalse = insumo que no se vende solo. Por defecto true.
base_unitstringNoValores: und, g, kg, lb, oz, ml, l, doc. Por defecto "und".
sold_by_weightbooleanNoRequiere base_unit g, kg o lb. Por defecto false.
initial_stockintegerNoCrea además un movimiento de entrada con este stock. Mínimo 1. Máximo 1000000000.
warehouse_idstring (uuid)NoBodega del stock inicial. Por defecto, la bodega predeterminada.

ProductUpdate

El stock no se edita aquí: usa POST /inventory/movements. La unidad, la venta por peso y el tipo de producto tampoco (cambian el significado del stock existente).

Envía al menos 1 campo.

Un campo que no esté en la lista se rechaza con VALIDATION_ERROR.

CampoTipoRequeridoDescripción
namestringNoMáximo 200 caracteres.
descriptionstringNoMáximo 5000 caracteres.
description_shortstringNoMáximo 300 caracteres.
skustringNoMáximo 60 caracteres.
category_idstring (uuid) | nullNo
base_priceintegerNoSi cambias base_price sin enviar final_price, final_price toma el mismo valor. Mínimo 0. Máximo 10000000000.
final_priceintegerNoPrecio al que vende la caja. Mínimo 0. Máximo 10000000000.
percent_discountnumberNoMínimo 0. Máximo 100.
tax_classstringNoValores: standard, reduced_5, excluded, exempt, service_19, event_package, bag, passthrough.
activebooleanNo
sellablebooleanNo

VariantUpdate

Envía al menos 1 campo.

Un campo que no esté en la lista se rechaza con VALIDATION_ERROR.

CampoTipoRequeridoDescripción
labelstringNoMáximo 120 caracteres.
skustringNoÚnico por cuenta. Máximo 60 caracteres.
base_priceintegerNoSi cambias base_price sin enviar final_price, final_price toma el mismo valor. Mínimo 0. Máximo 10000000000.
final_priceintegerNoPrecio al que vende la caja. Mínimo 0. Máximo 10000000000.
percent_discountnumberNoMínimo 0. Máximo 100.
activebooleanNo

CustomerCreate

Un campo que no esté en la lista se rechaza con VALIDATION_ERROR.

CampoTipoRequeridoDescripción
namestringSíMáximo 120 caracteres.
last_namestringNoMáximo 120 caracteres.
phonestringNoMáximo 30 caracteres.
emailstring (email) | nullNoMáximo 200 caracteres.
person_typestringNoValores: person, company. Por defecto "person".
document_typestringNoValores: CC, TI, NIT, CE, PASAPORTE. Por defecto "CC".
document_numberstringNoMáximo 30 caracteres.
contact_channelstringNoValores: none, store, whatsapp, instagram, website, referral. Por defecto "none".

CustomerUpdate

Envía al menos 1 campo.

Un campo que no esté en la lista se rechaza con VALIDATION_ERROR.

CampoTipoRequeridoDescripción
namestringNoMáximo 120 caracteres.
last_namestringNoMáximo 120 caracteres.
phonestringNoMáximo 30 caracteres.
emailstring (email) | nullNoMáximo 200 caracteres.
person_typestringNoValores: person, company. Por defecto "person".
document_typestringNoValores: CC, TI, NIT, CE, PASAPORTE. Por defecto "CC".
document_numberstringNoMáximo 30 caracteres.
contact_channelstringNoValores: none, store, whatsapp, instagram, website, referral. Por defecto "none".

StockMovementCreate

Un campo que no esté en la lista se rechaza con VALIDATION_ERROR.

CampoTipoRequeridoDescripción
product_idstring (uuid)Sí
warehouse_idstring (uuid)NoPor defecto, la bodega predeterminada (o la única bodega activa).
typestringSíin suma, out resta. Valores: in, out.
quantityintegerSíEn la unidad base del producto. Mínimo 1. Máximo 1000000000.
reasonstringNoMotivo visible en el historial. Por defecto "Movimiento vía API". Máximo 200 caracteres.
referencestringNoTu referencia (orden de compra, pedido…). Máximo 100 caracteres.