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
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
error | object | Sí | |
error.code | string | Sí | 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.message | string | Sí | Explicación en español, con el siguiente paso. |
error.param | string | No | Campo que causó el error, si aplica. |
error.request_id | string | Sí |
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
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
object | "account" | Sí | |
id | string (uuid) | Sí | Id de la cuenta (tenant). |
business | object | null | Sí | |
business.name | string | No | |
business.currency | string | No | |
plan | string | Sí | Valores: free, plus, pro. |
api_key | object | null | Sí | |
api_key.id | string (uuid) | No | |
api_key.name | string | No | |
api_key.environment | string | No | Valores: live, test. |
api_key.scopes | arreglo de Scope | No | |
api_key.expires_at | string (date-time) | null | No | |
data_freshness | object | Sí | 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_at | string (date-time) | null | No | |
data_freshness.devices | arreglo de object | No | |
data_freshness.devices[].name | string | null | No | |
data_freshness.devices[].kind | string | No | Valores: primary, satellite, kitchen. |
data_freshness.devices[].platform | string | null | No | |
data_freshness.devices[].last_sync_at | string (date-time) | null | No |
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.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
object | "product_variant" | Sí | |
id | string (uuid) | Sí | |
product_id | string (uuid) | Sí | |
label | string | Sí | Nombre de la variante ("Talla M / Rojo"). |
sku | string | null | Sí | |
base_price | integer | Sí | Precio de lista, antes del descuento propio del producto. |
final_price | integer | Sí | Precio al que el POS vende esta variante. Si es 0 en la variante, el POS usa el del producto. |
percent_discount | number | Sí | Descuento del producto sobre base_price, en porcentaje (0-100, puede tener decimales). |
images | arreglo de string (uri) | Sí | |
is_default | boolean | Sí | |
active | boolean | Sí | |
created_at | string (date-time) | Sí | |
updated_at | string (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.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
object | "product" | Sí | |
id | string (uuid) | Sí | |
name | string | Sí | |
description | string | Sí | |
description_short | string | Sí | |
sku | string | null | Sí | SKU del producto (null si no tiene). |
category_id | string (uuid) | null | Sí | |
kind | string | Sí | composite = se arma desde una receta y no descuenta su propio stock. Valores: simple, composite. |
sellable | boolean | Sí | false = insumo que no se vende por sí solo. |
active | boolean | Sí | |
tax_class | string | Sí | Clase fiscal del ítem. standard hereda del perfil fiscal del negocio. Valores: standard, reduced_5, excluded, exempt, service_19, event_package, bag, passthrough. |
base_price | integer | Sí | Precio de lista, antes del descuento propio del producto. |
final_price | integer | Sí | Precio al que el POS vende. Si el producto no tiene descuento es igual a base_price. |
percent_discount | number | Sí | Descuento del producto sobre base_price, en porcentaje (0-100, puede tener decimales). |
base_unit | string | Sí | Unidad base (und, g, kg, lb, oz, ml, l, doc). Stock y costo se expresan en ella. |
sold_by_weight | boolean | Sí | Se vende por peso: la cantidad de la línea es un peso en base_unit. |
stock | integer | null | Sí | 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_cost | number | Sí | Costo promedio ponderado por unidad base (informativo). |
image_url | string (uri) | null | Sí | |
images | arreglo de string (uri) | Sí | |
has_variants | boolean | Sí | |
variants | arreglo de ProductVariant | Sí | Variantes vigentes (no eliminadas). |
deleted_at | string (date-time) | null | Sí | |
created_at | string (date-time) | Sí | |
updated_at | string (date-time) | Sí |
Category
Categoría del catálogo.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
object | "category" | Sí | |
id | string (uuid) | Sí | |
name | string | Sí | |
description | string | null | Sí | |
image_url | string (uri) | null | Sí | |
sort_order | integer | Sí | |
deleted_at | string (date-time) | null | Sí | |
created_at | string (date-time) | Sí | |
updated_at | string (date-time) | Sí |
Customer
Cliente del negocio.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
object | "customer" | Sí | |
id | string (uuid) | Sí | |
name | string | Sí | |
last_name | string | null | Sí | |
email | string | null | Sí | |
phone | string | null | Sí | |
person_type | string | Sí | person (persona natural) o company (persona jurídica). |
document_type | string | Sí | Tipo de identificación: CC, TI, NIT, CE, PASAPORTE. |
document_number | string | null | Sí | |
contact_channel | string | null | Sí | Cómo llegó el cliente: none, store, whatsapp, instagram, website, referral. |
deleted_at | string (date-time) | null | Sí | |
created_at | string (date-time) | Sí | |
updated_at | string (date-time) | Sí |
Warehouse
Bodega del negocio.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
object | "warehouse" | Sí | |
id | string (uuid) | Sí | |
name | string | Sí | |
address | string | null | Sí | |
city | string | null | Sí | |
is_default | boolean | Sí | |
active | boolean | Sí | |
created_at | string (date-time) | Sí | |
updated_at | string (date-time) | Sí |
StockMovement
Movimiento del libro de inventario (solo se agregan, nunca se editan).
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
object | "stock_movement" | Sí | |
id | string (uuid) | Sí | |
product_id | string (uuid) | Sí | |
variant_id | string (uuid) | null | Sí | |
warehouse_id | string (uuid) | null | Sí | null si el movimiento llegó antes que su bodega. |
type | string | Sí | Tipo de movimiento tal como lo registró la caja. |
quantity | number | Sí | Cantidad en la unidad base del producto (puede ser fraccionaria). |
reason | string | null | Sí | |
reference | string | null | Sí | Referencia libre del movimiento. |
unit_cost | number | null | Sí | Costo por unidad base al momento del movimiento. |
origin_type | string | null | Sí | sale, purchase, adjustment, recipe_explosion, reversal. |
sale_id | string (uuid) | null | Sí | La venta que causó el movimiento, si aplica. |
created_at | string (date-time) | Sí | |
updated_at | string (date-time) | Sí |
LineTax
Impuesto cobrado en una línea, congelado al momento de la venta.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
code | string | Sí | Código DIAN del tributo: 01 IVA, 03 ICA, 04 INC, 22 INC bolsas. |
name | string | null | Sí | |
rate | number | null | Sí | Tarifa en PORCENTAJE entero (19 = 19 %), tal como se cobró. null en impuestos por unidad. |
per_unit | integer | null | Sí | Valor fijo por unidad (bolsas). null en impuestos por porcentaje. |
base | integer | Sí | Pesos colombianos (COP), entero sin decimales. |
amount | integer | Sí | Pesos colombianos (COP), entero sin decimales. |
TaxBreakdownEntry
Total de un tributo en el documento, agrupado por (código, tarifa).
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
code | string | Sí | |
rate | number | null | Sí | Porcentaje entero. |
per_unit | integer | null | Sí | |
base | integer | Sí | Pesos colombianos (COP), entero sin decimales. |
amount | integer | Sí | 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}.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
id | string (uuid) | Sí | |
document_type | DocumentType | Sí | |
status | string | Sí | |
cufe | string | null | Sí | CUFE (factura) o CUDE (documento POS). |
prefix | string | null | Sí | |
number | integer | Sí |
SaleItem
Línea de una venta.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
object | "sale_item" | Sí | |
id | string (uuid) | Sí | |
product_id | string (uuid) | null | Sí | null en líneas libres o si el producto ya no existe. |
variant_id | string (uuid) | null | Sí | |
item_kind | string | Sí | product o una línea libre. |
description | string | null | Sí | |
quantity | number | Sí | Puede ser fraccionaria (ventas por peso). |
unit_price | integer | Sí | Precio unitario con los impuestos porcentuales incluidos. |
subtotal | integer | Sí | Total de la línea con impuestos incluidos. |
unit_cost | number | null | Sí | Costo unitario congelado al vender. |
tax_class | string | Sí | |
taxes | arreglo de LineTax | null | Sí | null en líneas antiguas sin impuestos congelados. |
Sale
Venta. Ingreso neto = total - tax - tip_amount.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
object | "sale" | Sí | |
id | string (uuid) | Sí | |
status | string | Sí | Estado tal como lo registró el POS (completed, cancelled, open, pending…). |
document_kind | string | Sí | Documento que pidió el POS al cobrar. Valores: pos, invoice. |
payment_method | string | Sí | Medio de pago tal como lo registró el POS (CASH, CARD, NEQUI…). |
customer_id | string (uuid) | null | Sí | |
cash_session_id | string (uuid) | null | Sí | |
subtotal | integer | Sí | Suma de las líneas, impuestos incluidos. |
discount | integer | Sí | Pesos colombianos (COP), entero sin decimales. |
discount_percent | number | Sí | |
tax | integer | Sí | Parte del total que es impuesto. |
tip_amount | integer | Sí | Propina. Nunca es base gravable. |
total | integer | Sí | subtotal - discount + tip_amount. |
tax_breakdown | arreglo de TaxBreakdownEntry | null | Sí | |
notes | string | null | Sí | |
table_label | string | null | Sí | |
items | arreglo de SaleItem | Sí | |
invoices | arreglo de InvoiceSummary | Sí | |
occurred_at | string (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_at | string (date-time) | Sí | Cuando la venta llegó al servidor (una caja sin conexión la sube después). |
updated_at | string (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.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
object | "invoice" | Sí | |
id | string (uuid) | Sí | |
sale_id | string (uuid) | null | Sí | |
document_type | DocumentType | Sí | |
type_document_id | integer | null | Sí | Código del tipo de documento DIAN (1, 15, 26). |
status | string | Sí | pending, issued, rejected, emission_failed, annulled. |
dian_status | string | null | Sí | |
dian_message | string | null | Sí | Mensaje de la DIAN; solo cuando el documento fue emitido o rechazado. |
document_reason | string | null | Sí | Por qué se eligió este tipo de documento. |
prefix | string | null | Sí | |
number | integer | Sí | |
cufe | string | null | Sí | CUFE (factura) o CUDE (documento POS). |
subtotal | integer | Sí | Pesos colombianos (COP), entero sin decimales. |
tax | integer | Sí | Pesos colombianos (COP), entero sin decimales. |
total | integer | Sí | Pesos colombianos (COP), entero sin decimales. |
issued_at | string (date-time) | Sí | |
created_at | string (date-time) | Sí | |
updated_at | string (date-time) | Sí |
QuoteItem
Línea de una cotización.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
object | "quote_item" | Sí | |
id | string (uuid) | Sí | |
product_id | string (uuid) | null | Sí | |
variant_id | string (uuid) | null | Sí | |
item_kind | string | Sí | |
description | string | null | Sí | |
quantity | number | Sí | |
unit_price | integer | Sí | Con impuestos porcentuales incluidos. |
subtotal | integer | Sí | Pesos colombianos (COP), entero sin decimales. |
tax_class | string | Sí | |
taxes | arreglo de LineTax | null | Sí | |
note | string | null | Sí |
Quote
Cotización.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
object | "quote" | Sí | |
id | string (uuid) | Sí | |
number | string | null | Sí | COT-XXXX; solo existe cuando la cotización se envió. |
status | string | Sí | draft, sent, accepted, rejected, expired, converted. El vencimiento lo aplica la app al leer: compara con expires_at. |
customer_id | string (uuid) | null | Sí | |
converted_sale_id | string (uuid) | null | Sí | |
subtotal | integer | Sí | Pesos colombianos (COP), entero sin decimales. |
discount | integer | Sí | Pesos colombianos (COP), entero sin decimales. |
tax | integer | Sí | Pesos colombianos (COP), entero sin decimales. |
total | integer | Sí | Pesos colombianos (COP), entero sin decimales. |
tax_breakdown | arreglo de TaxBreakdownEntry | null | Sí | |
notes | string | null | Sí | |
payment_link | string | null | Sí | |
expires_at | string (date-time) | null | Sí | |
sent_at | string (date-time) | null | Sí | |
items | arreglo de QuoteItem | Sí | |
created_at | string (date-time) | Sí | |
updated_at | string (date-time) | Sí |
CashMovement
Entrada o salida manual de efectivo del cajón.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
object | "cash_movement" | Sí | |
id | string (uuid) | Sí | |
type | string | Sí | Valores: in, out. |
amount | integer | Sí | Pesos colombianos (COP), entero sin decimales. |
reason | string | null | Sí | |
created_at | string (date-time) | Sí |
CashSession
Turno de caja con sus movimientos de efectivo.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
object | "cash_session" | Sí | |
id | string (uuid) | Sí | |
status | string | Sí | open, closed, suspended. |
terminal_name | string | Sí | Nombre de la caja ("Caja 01"). |
opening_cash | integer | Sí | Pesos colombianos (COP), entero sin decimales. |
expected_cash | integer | null | Sí | Lo que la app calculó que debía haber al cerrar. |
closing_cash | integer | null | Sí | Lo que se contó al cerrar. |
opened_at | string (date-time) | Sí | |
closed_at | string (date-time) | null | Sí | |
movements | arreglo de CashMovement | Sí | |
created_at | string (date-time) | Sí | |
updated_at | string (date-time) | Sí |
DailySalesDay
Totales de un día (hora de Bogotá).
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
date | string (date) | Sí | |
sales_count | integer | Sí | Número de ventas completadas. |
subtotal | integer | Sí | Pesos colombianos (COP), entero sin decimales. |
discount | integer | Sí | Pesos colombianos (COP), entero sin decimales. |
tax | integer | Sí | Pesos colombianos (COP), entero sin decimales. |
tip_amount | integer | Sí | Pesos colombianos (COP), entero sin decimales. |
total | integer | Sí | 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.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
object | "daily_sales_report" | Sí | |
timezone | "America/Bogota" | Sí | |
currency | "COP" | Sí | |
from | string (date) | Sí | |
to | string (date) | Sí | |
days | arreglo de DailySalesDay | Sí | Un elemento por día del rango, incluidos los días sin ventas (en cero). |
totals | object | Sí | |
totals.sales_count | integer | Sí | Número de ventas completadas. |
totals.subtotal | integer | Sí | Pesos colombianos (COP), entero sin decimales. |
totals.discount | integer | Sí | Pesos colombianos (COP), entero sin decimales. |
totals.tax | integer | Sí | Pesos colombianos (COP), entero sin decimales. |
totals.tip_amount | integer | Sí | Pesos colombianos (COP), entero sin decimales. |
totals.total | integer | Sí | Pesos colombianos (COP), entero sin decimales. |
Event
Evento del registro de webhooks. Sirve para reconciliar entregas perdidas.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
object | "event" | Sí | |
id | string (uuid) | Sí | |
type | string | Sí | Tipo de evento, por ejemplo sale.completed. |
created_at | string (date-time) | Sí | |
data | object | Sí | |
data.object | object | Sí | 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.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
name | string | Sí | Máximo 120 caracteres. |
description | string | No | Máximo 1000 caracteres. |
sort_order | integer | No | Mí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.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
name | string | No | Máximo 120 caracteres. |
description | string | No | Máximo 1000 caracteres. |
sort_order | integer | No | Mínimo 0. Máximo 100000. |
ProductCreate
Un campo que no esté en la lista se rechaza con VALIDATION_ERROR.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
name | string | Sí | Máximo 200 caracteres. |
description | string | No | Máximo 5000 caracteres. |
description_short | string | No | Máximo 300 caracteres. |
sku | string | No | Máximo 60 caracteres. |
category_id | string (uuid) | null | No | |
base_price | integer | Sí | Precio base en pesos. Mínimo 0. Máximo 10000000000. |
final_price | integer | No | Precio al que vende la caja. Si no se envía, es igual a base_price. Mínimo 0. Máximo 10000000000. |
percent_discount | number | No | Mínimo 0. Máximo 100. |
tax_class | string | No | Clase 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". |
active | boolean | No | Por defecto true. |
sellable | boolean | No | false = insumo que no se vende solo. Por defecto true. |
base_unit | string | No | Valores: und, g, kg, lb, oz, ml, l, doc. Por defecto "und". |
sold_by_weight | boolean | No | Requiere base_unit g, kg o lb. Por defecto false. |
initial_stock | integer | No | Crea además un movimiento de entrada con este stock. Mínimo 1. Máximo 1000000000. |
warehouse_id | string (uuid) | No | Bodega 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.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
name | string | No | Máximo 200 caracteres. |
description | string | No | Máximo 5000 caracteres. |
description_short | string | No | Máximo 300 caracteres. |
sku | string | No | Máximo 60 caracteres. |
category_id | string (uuid) | null | No | |
base_price | integer | No | Si cambias base_price sin enviar final_price, final_price toma el mismo valor. Mínimo 0. Máximo 10000000000. |
final_price | integer | No | Precio al que vende la caja. Mínimo 0. Máximo 10000000000. |
percent_discount | number | No | Mínimo 0. Máximo 100. |
tax_class | string | No | Valores: standard, reduced_5, excluded, exempt, service_19, event_package, bag, passthrough. |
active | boolean | No | |
sellable | boolean | No |
VariantUpdate
Envía al menos 1 campo.
Un campo que no esté en la lista se rechaza con VALIDATION_ERROR.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
label | string | No | Máximo 120 caracteres. |
sku | string | No | Único por cuenta. Máximo 60 caracteres. |
base_price | integer | No | Si cambias base_price sin enviar final_price, final_price toma el mismo valor. Mínimo 0. Máximo 10000000000. |
final_price | integer | No | Precio al que vende la caja. Mínimo 0. Máximo 10000000000. |
percent_discount | number | No | Mínimo 0. Máximo 100. |
active | boolean | No |
CustomerCreate
Un campo que no esté en la lista se rechaza con VALIDATION_ERROR.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
name | string | Sí | Máximo 120 caracteres. |
last_name | string | No | Máximo 120 caracteres. |
phone | string | No | Máximo 30 caracteres. |
email | string (email) | null | No | Máximo 200 caracteres. |
person_type | string | No | Valores: person, company. Por defecto "person". |
document_type | string | No | Valores: CC, TI, NIT, CE, PASAPORTE. Por defecto "CC". |
document_number | string | No | Máximo 30 caracteres. |
contact_channel | string | No | Valores: 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.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
name | string | No | Máximo 120 caracteres. |
last_name | string | No | Máximo 120 caracteres. |
phone | string | No | Máximo 30 caracteres. |
email | string (email) | null | No | Máximo 200 caracteres. |
person_type | string | No | Valores: person, company. Por defecto "person". |
document_type | string | No | Valores: CC, TI, NIT, CE, PASAPORTE. Por defecto "CC". |
document_number | string | No | Máximo 30 caracteres. |
contact_channel | string | No | Valores: none, store, whatsapp, instagram, website, referral. Por defecto "none". |
StockMovementCreate
Un campo que no esté en la lista se rechaza con VALIDATION_ERROR.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
product_id | string (uuid) | Sí | |
warehouse_id | string (uuid) | No | Por defecto, la bodega predeterminada (o la única bodega activa). |
type | string | Sí | in suma, out resta. Valores: in, out. |
quantity | integer | Sí | En la unidad base del producto. Mínimo 1. Máximo 1000000000. |
reason | string | No | Motivo visible en el historial. Por defecto "Movimiento vía API". Máximo 200 caracteres. |
reference | string | No | Tu referencia (orden de compra, pedido…). Máximo 100 caracteres. |