Comprar
POSThttps://api.lavitrina-online.com/api/storefront/purchases
Crea la compra del cliente en tu tienda y cobra en el momento. Antes, el cliente debe haber aceptado los términos y guardado una tarjeta.
La tienda sale del token del cliente (inició sesión en tu sitio), y el precio sale siempre del ítem: el cliente solo elige qué y cuántos.
| Campo | Tipo | Descripción |
|---|---|---|
Items |
lista, 1 a 50 | [{ "ItemId": 42, "Quantity": 2 }]. Quantity de 1 a 10000. |
Delivery.Method |
texto | Por ahora solo AgreeWithSeller: la tienda acuerda la entrega con el cliente. |
Delivery.ContactPhone |
texto, 7 a 20 | Teléfono para coordinar la entrega. |
Delivery.Notes |
texto, hasta 500 | Opcional. Indicaciones del cliente. |
Payment.AcceptanceTokenId |
entero | El de Aceptar los términos, ya aceptado. |
Payment.CardId |
entero | Una de sus tarjetas. |
Ejemplo
Sección titulada «Ejemplo»curl -X POST "https://api.lavitrina-online.com/api/storefront/purchases" \ -H "Authorization: Bearer $TOKEN_CLIENTE" \ -H "Content-Type: application/json" \ -d '{"Items":[{"ItemId":42,"Quantity":2}],"Delivery":{"Method":"AgreeWithSeller","ContactPhone":"3001234567","Notes":"Entregar en la tarde"},"Payment":{"AcceptanceTokenId":57,"CardId":12}}'const response = await fetch('https://api.lavitrina-online.com/api/storefront/purchases', { method: 'POST', headers: { Authorization: `Bearer ${tokenCliente}`, 'Content-Type': 'application/json', }, body: JSON.stringify({ "Items": [ { "ItemId": 42, "Quantity": 2 } ], "Delivery": { "Method": "AgreeWithSeller", "ContactPhone": "3001234567", "Notes": "Entregar en la tarde" }, "Payment": { "AcceptanceTokenId": 57, "CardId": 12 } }),});const data = await response.json();import requests
response = requests.post( "https://api.lavitrina-online.com/api/storefront/purchases", headers={"Authorization": f"Bearer {token_cliente}"}, json={ "Items": [ { "ItemId": 42, "Quantity": 2 } ], "Delivery": { "Method": "AgreeWithSeller", "ContactPhone": "3001234567", "Notes": "Entregar en la tarde" }, "Payment": { "AcceptanceTokenId": 57, "CardId": 12 } },)data = response.json()Respuesta 201
Sección titulada «Respuesta 201»{ "Id": "4a3045a9-419e-4dc6-9b31-cb4e5265f8e4", "Code": "4A3045", "StoreId": "4d7fc800-a6ba-4686-8775-6a29919b3060", "CustomerId": "daec07a3-4fc2-4db5-ad30-c343c76ecddc", "CustomerName": "Laura Gómez", "Lines": [ { "ItemId": 42, "ItemName": "Camisa de lino", "UnitPriceInCents": 8990000, "Quantity": 2, "SubtotalInCents": 17980000 } ], "TotalInCents": 17980000, "Currency": "COP", "Status": "Paid", "Delivery": { "Method": "AgreeWithSeller", "Status": "Pending", "ContactPhone": "3001234567", "Notes": "Entregar en la tarde" }, "CreatedAt": "2026-10-21T16:41:54.463Z", "UpdatedAt": "2026-10-21T16:41:55.010Z"}| Campo | Descripción |
|---|---|
Code |
Código corto para mostrar al cliente y hablar con la tienda. |
Status |
Paid (pagada) o PendingPayment (el banco aún no responde). Ver valores. |
Delivery.Status |
Estado de la entrega. Lo avanza la tienda desde el dashboard. |
Según el código de respuesta
Sección titulada «Según el código de respuesta»| Código | Qué pasó | Qué hacer |
|---|---|---|
201 |
Compra creada, pagada o en proceso. | Si es PendingPayment, consulta luego con Actualizar el pago. |
402 |
El banco rechazó el pago. El cuerpo trae la compra con Status: PaymentFailed y las unidades vuelven al inventario. |
Pide otra tarjeta y crea una compra nueva. |
404 |
Algún ítem no existe o es de otra tienda. | Revisa los ItemId. |
409 |
No hay unidades suficientes de algún ítem. | Actualiza el carrito. |
502 |
La compra quedó guardada (PendingPayment) pero el servicio de pagos no respondió. El cuerpo trae la compra. |
No la repitas: consulta con Actualizar el pago. |