Ir al contenido
docs

Listar ventas

Permiso requerido: sales:read.

GET /public/v1/sales

Permiso sales:read · Ventas

Parámetros

Parámetros de consulta

NombreTipoRequeridoDescripción
limitintegerNoPor defecto: 25. Mínimo: 1. Máximo: 100.
starting_afterstringNoEl next_cursor de la página anterior, tal cual.
created_sincestring (date-time)NoISO 8601 con zona horaria. Incluye.
created_untilstring (date-time)NoISO 8601 con zona horaria. Excluye.
updated_sincestring (date-time)NoISO 8601 con zona horaria. Para sincronización incremental.
statusstringNoEstado exacto, por ejemplo completed. Máximo 40 caracteres.
customer_idstring (uuid)NoVentas de ese cliente.
document_kindstringNoTipo de documento pedido. Valores: pos, invoice.
occurred_sincestring (date-time)NoVentas registradas en la caja desde este instante (incluye). ISO 8601 con zona horaria.
occurred_untilstring (date-time)NoVentas registradas en la caja antes de este instante (excluye).

Ejemplo de petición

Terminal
curl "https://api.posdata.so/public/v1/sales?limit=25" \
  -H "Authorization: Bearer $POSDATA_API_KEY"
JavaScript
const res = await fetch('https://api.posdata.so/public/v1/sales?limit=25', {
  headers: {
    Authorization: `Bearer ${process.env.POSDATA_API_KEY}`,
  },
});
const data = await res.json();
if (!res.ok) throw new Error(`${data.error.code}: ${data.error.message} (${data.error.request_id})`);
Python
import os

import requests

res = requests.get(
    "https://api.posdata.so/public/v1/sales",
    headers={
        "Authorization": f"Bearer {os.environ['POSDATA_API_KEY']}",
    },
    params={"limit": 25},
    timeout=30,
)
data = res.json()
if not res.ok:
    raise RuntimeError(f"{data['error']['code']}: {data['error']['message']} ({data['error']['request_id']})")
PHP
<?php
$ch = curl_init('https://api.posdata.so/public/v1/sales?limit=25');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        'Authorization: Bearer ' . getenv('POSDATA_API_KEY'),
    ],
]);
$data = json_decode(curl_exec($ch), true);
if (curl_getinfo($ch, CURLINFO_RESPONSE_CODE) >= 400) {
    throw new RuntimeException("{$data['error']['code']}: {$data['error']['message']} ({$data['error']['request_id']})");
}

Respuesta

200 OK.

CampoTipoRequeridoDescripción
object"list"Sí—
dataarreglo de SaleSí—
has_morebooleanSí—
next_cursorstring | nullSí—
Ejemplo de respuesta (valores ilustrativos)
{
  "object": "list",
  "data": [
    {
      "object": "sale",
      "id": "3f1c2e8d-7a10-4d0b-9a57-0b6f2f0e5c1d",
      "status": "texto",
      "document_kind": "pos",
      "payment_method": "texto",
      "customer_id": "3f1c2e8d-7a10-4d0b-9a57-0b6f2f0e5c1d",
      "cash_session_id": "3f1c2e8d-7a10-4d0b-9a57-0b6f2f0e5c1d",
      "subtotal": 25900,
      "discount": 1,
      "discount_percent": 19,
      "tax": 1,
      "tip_amount": 25900,
      "total": 25900,
      "tax_breakdown": [
        null
      ],
      "notes": "texto",
      "table_label": "texto",
      "items": [
        {
          "object": null,
          "id": null,
          "product_id": null,
          "variant_id": null,
          "item_kind": null,
          "description": null,
          "quantity": null,
          "unit_price": null,
          "subtotal": null,
          "unit_cost": null,
          "tax_class": null,
          "taxes": null
        }
      ],
      "invoices": [
        {
          "id": null,
          "document_type": null,
          "status": null,
          "cufe": null,
          "prefix": null,
          "number": null
        }
      ],
      "occurred_at": "2026-09-28T15:04:05.000Z",
      "created_at": "2026-09-28T15:04:05.000Z",
      "updated_at": "2026-09-28T15:04:05.000Z"
    }
  ],
  "has_more": true,
  "next_cursor": "texto"
}

Errores

Todo error responde con un objeto Error y un request_id. Ramifica por error.code, nunca por el mensaje.

Cuerpo: un objeto Error. Qué significa cada código y qué hacer: Errores.

VALIDATION_ERRORINVALID_JSONINVALID_CURSOR

Cuerpo: un objeto Error. Qué significa cada código y qué hacer: Errores.

UNAUTHENTICATEDINVALID_API_KEYAPI_KEY_REVOKEDAPI_KEY_EXPIREDAPI_KEY_WRONG_ENVIRONMENTACCOUNT_INACTIVE

Cuerpo: un objeto Error. Qué significa cada código y qué hacer: Errores.

PLAN_REQUIREDINSUFFICIENT_SCOPEBROWSER_REQUESTS_NOT_ALLOWED

Cuerpo: un objeto Error. Qué significa cada código y qué hacer: Errores.

RATE_LIMITED

Cuerpo: un objeto Error. Qué significa cada código y qué hacer: Errores.

INTERNAL_ERROR