Integración VenPOS ↔ Yapu

Especificación de los endpoints de VenPOS que Yapu consume. Todas las peticiones son POST en JSON y van a una sola URL por función (el product_id va en el cuerpo). Actualizado: 2026-08-25.

Autenticación

Cada tienda de VenPOS tiene un token único. Se envía en el header:

Authorization: Bearer <token_de_la_tienda>

1 · Menú en vivo (listar productos)

POST https://venpos.app/functions/yappuGetMenu

Respuesta 200:

{
  "tenant": {
    "business_name": "Mi Tienda",
    "base_currency": "USD",
    "tax_mode": "incluido",
    "tax_rate": 0.16
  },
  "products": [
    {
      "id": "VP-001",
      "name": "Coca Cola 500ml",
      "description": "Bebida refrescante",
      "price": 1.50,
      "image_url": "https://venpos.app/img/001.jpg",
      "category": "Bebidas",
      "sku": "CC500",
      "active": true,
      "stock": 24,
      "is_weighable": false,
      "unit": "und",
      "unit_type": "liquido",
      "tax_rate": 0.16
    }
  ]
}
  • active: false = no se vende (Yapu no lo muestra).
  • stock: null = sin control de stock; 0 = agotado.

2 · Descontar stock al vender

POST https://venpos.app/functions/yappuReducestock — Crea la venta en VenPOS con canal Yappu (aparece en Dashboard y Reportes como venta normal; el inventario baja igual que en el POS).

Petición (una llamada por producto del carrito):

{
  "product_id": "VP-001",
  "quantity": 2,
  "reference": "ORD-482910",
  "order_id": "abc123",
  "customer": {
    "name": "María Pérez",
    "phone": "0412-1234567",
    "address": "Av. Principal, Edif. ..."
  },
  "delivery": {
    "address": "Av. Principal, Edif. ...",
    "notes": "dejar en portería"
  }
}

Respuesta 200:

{ "ok": true, "stock": 22, "sale_id": "...", "sale_number": "VTA-...", "reference": "ORD-482910" }
  • Idempotente: el mismo (reference, product_id) repetido no descuenta dos veces.
  • Para un carrito con varios productos: una llamada por producto, mismo order_id y mismo reference (difieren por product_id).

3 · Restaurar stock (pedido cancelado)

POST https://venpos.app/functions/yappuRestorestock

{
  "product_id": "VP-001",
  "quantity": 2,
  "reference": "ORD-482910",
  "order_id": "abc123"
}

Respuesta 200:

{ "ok": true, "stock": 24, "reference": "ORD-482910" }

Repone el inventario y quita el ítem de la venta: si la venta queda vacía = refunded; si quedan ítems = partial_refund.

Códigos de error

  • 401 — Token inválido o vencido.
  • 404 — Producto no existe.
  • 422 — Stock insuficiente { available, requested }.

Resumen

Tres endpoints POST (yappuGetMenu, yappuReducestock, yappuRestorestock) bajo https://venpos.app/functions, con token Bearer por tienda e idempotencia por (reference, product_id). Yapu lee el inventario y descuenta; VenPOS conserva la titularidad del inventario y registra las ventas con canal Yappu.

Yapu.app · Documento técnico de integración con VenPOS