Conectá tu sistema con NexoPOS
Si el comercio usa un ERP, Odoo o un sistema propio, puede leer su catálogo, escribir precios y stock, y leer lo que se vendió en el mostrador — sin que nadie tenga que cargar nada a mano en la pantalla del POS.
Empezar
Tres pasos. El primero lo hace el comerciante; los otros dos, quien programe.
- El comerciante genera una clave en NexoPOS → Configuración → Conectar tu sistema. Le pone un nombre para saber cuál es y la copia. Se muestra una sola vez.
- Probá que llega. Si esto devuelve tus productos, está todo bien:
curl -s "https://nexopos.app/api/erp/v1/productos" \
-H "Authorization: Bearer npos_TU_CLAVE"- Escribí un precio y miralo en el POS. Con eso ya sabés que el circuito completo funciona.
curl -s -X PUT "https://nexopos.app/api/erp/v1/precios" \
-H "Authorization: Bearer npos_TU_CLAVE" \
-H "Content-Type: application/json" \
-d '{"precios":[{"ean":"7798042240180","precio_centavos":5200000}]}'Base de todas las llamadas: https://nexopos.app/api/erp/v1
La clave
Authorization: Bearer npos_xxxxxxxxxxxxxxxxxxxxxxxxEs de un comercio: abre ese y ninguno más. Si se filtra, el alcance del daño es ese negocio y no la plataforma.
Se muestra una sola vez. De nuestra base sale solo un hash, así que no hay forma de recuperarla — ni nosotros podemos. Si se pierde, el comerciante genera otra y revoca la anterior.
Es incómodo a propósito. Una clave que se puede recuperar es una clave que alguien puede ir a buscar a un backup, a un dump o a una consulta de soporte.
El comerciante ve cuándo se usó cada clave por última vez y puede revocarla cuando quiera. Revocada, la siguiente llamada devuelve 401.
Convenciones
Los importes van en centavos, enteros
$52.000 es 5200000. Nunca decimales: un float arrastrando medio centavo por 3000 productos termina en una diferencia que después nadie encuentra.
Cómo se identifica un producto
Cada línea que escribís lleva una de estas tres:
ean | El código de barras. Es lo normal. |
sku | El código de balanza, si el comercio lo usa. |
id | El id de NexoPOS, que sale de GET /productos. |
Si un EAN aparece en dos productos del mismo comercio, esa línea no se aplica y vuelve en no_encontrados. No adivinamos cuál era.
Nada se cachea
El stock cambia con cada venta del mostrador. Un catálogo de hace cinco minutos vende lo que ya no está.
Leer el catálogo
GET /productos
Todo lo que el comercio tiene, paginado de a 500.
{
"productos": [{
"id": "184",
"ean": "7798042240180",
"sku": null,
"nombre": "Silla Plástica Voss 2000 — unidad",
"unidad": "unidad",
"precio_centavos": 5200000,
"costo_centavos": 3000000,
"stock": 17,
"stock_minimo": 0,
"es_insumo": false,
"publicado_en_tienda": true,
"actualizado": "2026-09-15T03:28:00.000Z"
}],
"page": 1, "pageSize": 500, "total": 3
}precio_centavos: null es un producto sin precio de venta: no se puede cobrar en el mostrador ni aparece en la tienda online hasta que tenga uno. Es lo que pasa, por ejemplo, con un catálogo recién importado.
Escribir precios
PUT /precios
Hasta 1000 por llamada.
{
"precios": [
{ "ean": "7798042240180", "precio_centavos": 5200000, "costo_centavos": 3000000 }
]
}{ "aplicados": 1, "no_encontrados": [] }El costo es opcional: si no va, queda el que estaba. El precio de venta es el único número que tu sistema puede pisar sin pensarlo, porque no hay nadie más escribiéndolo. Con el stock no pasa lo mismo.
Escribir stock
PUT /stock
{
"modo": "ajuste",
"stock": [ { "ean": "7798042240180", "cantidad": 5 } ]
}| modo | Qué hace |
|---|---|
ajuste default | Suma o resta. -2 saca dos. |
absoluto | Deja el stock en ese número. |
Elegir mal acá cuesta plata. Mirá el ejemplo.
Tu sistema sincroniza a las 14:00 y ve 12 unidades. A las 14:30 el cajero vende 3 y quedan 9. A las 15:00 volvés a sincronizar con el número que vos tenés:
absoluto → «dejalo en 12» | el stock vuelve a 12 |
ajuste → «sumá 0» | el stock queda en 9 |
Con absoluto reaparecieron tres unidades que ya no están. El mostrador las va a vender de nuevo y no van a estar en el depósito. Con ajuste eso no puede pasar, porque no reescribe: acumula sobre lo que haya.
Cuándo usar cada uno
ajustepara el día a día. Entró mercadería, sumás lo que entró. Es el único seguro cuando el mostrador también vende.absolutosolo cuando tu número es la verdad completa: justo después de un inventario físico, o si el POS no vende nada de ese producto.
Y si tu sistema quiere llevar el stock él mismo, tiene que leer las ventas del mostrador. La venta del cajero no pasa por tu ERP: pasa por acá.
Cada escritura deja un movimiento de tipo erp con lo que cambió, no con lo que quedó, así la suma de los movimientos sigue dando el stock.
Leer las ventas
GET /ventas?desde=
curl -s "https://nexopos.app/api/erp/v1/ventas?desde=2026-09-15T00:00:00Z" \
-H "Authorization: Bearer npos_TU_CLAVE"{
"ventas": [{
"id": "1", "ticket": 1,
"fecha": "2026-09-15T03:28:32.005Z",
"total_centavos": 10400000,
"medio_pago": "cash",
"es_reembolso": false,
"lineas": [{
"producto_id": 184, "ean": "7798042240180", "sku": null,
"nombre": "Silla Plástica Voss 2000 — unidad",
"cantidad": "2.000", "precio_centavos": 5200000
}]
}],
"hasta": "2026-09-15T03:28:32.005Z",
"hay_mas": false
}Cómo paginar
Guardá el hasta y mandalo como desde en la próxima llamada. Mientras hay_mas sea true, seguí pidiendo.
Incluye los pedidos de la tienda online entregados, porque terminan como nota de venta igual que una venta del mostrador. Un reembolso viene con es_reembolso: true y cantidades negativas: es una venta al revés, no un registro aparte que haya que interpretar.
Errores
401 | Clave ausente, inválida o revocada. |
400 | Faltan datos, o el cuerpo no tiene la forma esperada. |
409 | La operación choca con el estado actual. |
El cuerpo trae { "error": "…" } con un mensaje escrito para leerse: dice qué falta. Si lo vas a mostrar en tu sistema, mostralo tal cual — está pensado para que lo entienda quien tiene que arreglarlo.
Lo que todavía no hay
Lo decimos para que no lo busques: no está, no es que lo estés haciendo mal.
- Crear productos desde la API. Hoy entran desde el catálogo de Nexo B2B o se crean en el POS.
- Webhooks hacia tu sistema. Hoy tenés que preguntar por
/ventas.
Si necesitás alguna de las dos, escribinos: las dos son el paso siguiente natural y saber que hacen falta cambia el orden.