Skip to content

Gastos

Un gasto (expense) registra un egreso operativo de una sucursal —servicios, alquiler, suministros, etc.— que no aumenta el inventario. Opcionalmente puede asociarse a un proveedor y a un método de pago.

La URL base de producción es https://api-pos.zelta.dev/public/v1 y todas las rutas se expresan relativas a ella. Todas las peticiones deben hacerse sobre HTTPS e incluir tu API key. Consulta .

Registrar un gasto

http
POST /expenses
CampoTipoRequeridoDescripción
branchIdstring (cuid2)NoSucursal del gasto. Por defecto, la sucursal de la API key.
categorystring (≤100)Categoría del gasto (ej. "Servicios", "Alquiler").
descriptionstring (≤500)NoDescripción del gasto.
amountnumber (≥0)Monto base del gasto, en B/.
taxAmountnumber (≥0)NoImpuesto del gasto, en B/.
supplierIdstring (cuid2)NoProveedor asociado.
paymentMethodstring (cuid2)NoMétodo de pago. Si se envía, el gasto se registra como movimiento de efectivo en la sesión de caja.

INFO

Cuando incluyes paymentMethod, Zelta POS asienta el gasto como un movimiento de salida de efectivo en la sesión de caja activa de la sucursal. Si lo omites, el gasto se registra sin afectar la caja.

bash
curl -X POST "https://api-pos.zelta.dev/public/v1/expenses" \
  -H "Authorization: Bearer zpk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "category": "Servicios",
    "description": "Factura de energía eléctrica - enero",
    "amount": 142.50,
    "taxAmount": 9.98,
    "supplierId": "pr8h3k6m9p2q5v8r1n4t7w0y",
    "paymentMethod": "pm3b8n5k2j7h9g4f1d6s0a8q"
  }'

Ejemplo JS

javascript
const res = await fetch('https://api-pos.zelta.dev/public/v1/expenses', {
  method: 'POST',
  headers: { 'Authorization': `Bearer ${process.env.ZELTA_POS_API_KEY}`, 'Content-Type': 'application/json' },
  body: JSON.stringify({
    category: 'Servicios',
    description: 'Factura de energía eléctrica - enero',
    amount: 142.50,
    taxAmount: 9.98,
    supplierId: 'pr8h3k6m9p2q5v8r1n4t7w0y',
    paymentMethod: 'pm3b8n5k2j7h9g4f1d6s0a8q'
  })
});
const data = await res.json();

Ejemplo Py

python
import requests
res = requests.post(
    'https://api-pos.zelta.dev/public/v1/expenses',
    headers={'Authorization': 'Bearer zpk_live_xxx', 'Content-Type': 'application/json'},
    json={
        'category': 'Servicios',
        'description': 'Factura de energía eléctrica - enero',
        'amount': 142.50,
        'taxAmount': 9.98,
        'supplierId': 'pr8h3k6m9p2q5v8r1n4t7w0y',
        'paymentMethod': 'pm3b8n5k2j7h9g4f1d6s0a8q'
    }
)
data = res.json()

Respuesta 201 Created:

json
{
  "id": "ex2k5m8p1q4v7r0n3t6w9y2z",
  "branchId": "br3b8n5k2j7h9g4f1d6s0a8q",
  "supplierId": "pr8h3k6m9p2q5v8r1n4t7w0y",
  "paymentMethodId": "pm3b8n5k2j7h9g4f1d6s0a8q",
  "category": "Servicios",
  "description": "Factura de energía eléctrica - enero",
  "amount": 142.50,
  "taxAmount": 9.98,
  "total": 152.48,
  "date": "2026-01-31T20:15:00.000Z",
  "createdAt": "2026-01-31T20:15:00.000Z",
  "updatedAt": "2026-01-31T20:15:00.000Z"
}

Los campos supplierId, paymentMethodId y description pueden ser null.

Problemas comunes

CódigoHTTPCausa
validation_error400Falta category, amount negativo o tipos inválidos.
unauthorized401API key ausente o inválida.
not_found404La branchId, el supplierId o el paymentMethod no existen.
conflict409Se envió paymentMethod pero no hay una sesión de caja abierta.

Listar gastos

http
GET /expenses

Acepta los parámetros de : start, limit, updatedSince, from, to y metadata.

bash
curl "https://api-pos.zelta.dev/public/v1/expenses?from=2026-01-01&to=2026-01-31&metadata=true" \
  -H "Authorization: Bearer zpk_live_xxx"

Ejemplo JS

javascript
const res = await fetch('https://api-pos.zelta.dev/public/v1/expenses?from=2026-01-01&to=2026-01-31&metadata=true', {
  headers: { 'Authorization': `Bearer ${process.env.ZELTA_POS_API_KEY}` }
});
const data = await res.json();

Ejemplo Py

python
import requests
res = requests.get(
    'https://api-pos.zelta.dev/public/v1/expenses',
    headers={'Authorization': 'Bearer zpk_live_xxx'},
    params={'from': '2026-01-01', 'to': '2026-01-31', 'metadata': 'true'}
)
data = res.json()

Respuesta 200 OK:

json
{
  "data": [
    {
      "id": "ex2k5m8p1q4v7r0n3t6w9y2z",
      "branchId": "br3b8n5k2j7h9g4f1d6s0a8q",
      "supplierId": "pr8h3k6m9p2q5v8r1n4t7w0y",
      "paymentMethodId": "pm3b8n5k2j7h9g4f1d6s0a8q",
      "category": "Servicios",
      "description": "Factura de energía eléctrica - enero",
      "amount": 142.50,
      "taxAmount": 9.98,
      "total": 152.48,
      "date": "2026-01-31T20:15:00.000Z",
      "createdAt": "2026-01-31T20:15:00.000Z",
      "updatedAt": "2026-01-31T20:15:00.000Z"
    }
  ],
  "metadata": { "total": 87 }
}

Obtener un gasto

http
GET /expenses/{id}
CampoTipoRequeridoDescripción
idstring (cuid2)Identificador del gasto.

Devuelve el objeto del gasto directamente (sin envoltorio). Si no existe, responde 404 not_found.

Actualizar un gasto

http
PUT /expenses/{id}
CampoTipoRequeridoDescripción
categorystring (≤100)NoNueva categoría.
descriptionstring o nullNoNueva descripción.
amountnumber (≥0)NoNuevo monto base.
taxAmountnumber (≥0)NoNuevo impuesto.
supplierIdstring (cuid2) o nullNoCambia o elimina el proveedor.
paymentMethodstring (cuid2) o nullNoCambia o elimina el método de pago.

WARNING

Debes enviar al menos uno de los campos anteriores. Una petición con el cuerpo vacío devuelve validation_error.

bash
curl -X PUT "https://api-pos.zelta.dev/public/v1/expenses/ex2k5m8p1q4v7r0n3t6w9y2z" \
  -H "Authorization: Bearer zpk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{ "amount": 150.00, "description": "Factura de energía eléctrica - enero (corregida)" }'

Ejemplo JS

javascript
const res = await fetch('https://api-pos.zelta.dev/public/v1/expenses/ex2k5m8p1q4v7r0n3t6w9y2z', {
  method: 'PUT',
  headers: { 'Authorization': `Bearer ${process.env.ZELTA_POS_API_KEY}`, 'Content-Type': 'application/json' },
  body: JSON.stringify({ amount: 150.00, description: 'Factura de energía eléctrica - enero (corregida)' })
});
const data = await res.json();

Ejemplo Py

python
import requests
res = requests.put(
    'https://api-pos.zelta.dev/public/v1/expenses/ex2k5m8p1q4v7r0n3t6w9y2z',
    headers={'Authorization': 'Bearer zpk_live_xxx', 'Content-Type': 'application/json'},
    json={ 'amount': 150.00, 'description': 'Factura de energía eléctrica - enero (corregida)' }
)
data = res.json()

Respuesta 200 OK: devuelve el objeto del gasto actualizado. Si no existe, responde 404 not_found.

Problemas comunes

CódigoHTTPCausa
validation_error400Cuerpo vacío o tipos inválidos.
unauthorized401API key ausente o inválida.
not_found404El gasto, el supplierId o el paymentMethod no existen.

Siguientes pasos

  • — registra egresos que sí aumentan inventario.
  • — gestiona cobros y abonos.
  • — descubre métodos de pago, sucursales y proveedores.
  • — paginación, sincronización y códigos de error.

Documentación oficial de Zelta