Ir al contenido
docs

Ventas por día

Solo ventas con estado completed. Rango inclusivo de hasta 92 días.

GET /public/v1/reports/daily-sales

Permiso reports:read · Reportes

Parámetros

Parámetros de consulta

NombreTipoRequeridoDescripción
fromstring (date)SíPrimer día (YYYY-MM-DD), inclusive.
tostring (date)SíÚltimo día (YYYY-MM-DD), inclusive.

Ejemplo de petición

Terminal
curl "https://api.posdata.so/public/v1/reports/daily-sales" \
  -H "Authorization: Bearer $POSDATA_API_KEY"
JavaScript
const res = await fetch('https://api.posdata.so/public/v1/reports/daily-sales', {
  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/reports/daily-sales",
    headers={
        "Authorization": f"Bearer {os.environ['POSDATA_API_KEY']}",
    },
    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/reports/daily-sales');
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: un objeto DailySalesReport.

CampoTipoRequeridoDescripción
object"daily_sales_report"Sí—
timezone"America/Bogota"Sí—
currency"COP"Sí—
fromstring (date)Sí—
tostring (date)Sí—
daysarreglo de DailySalesDaySíUn elemento por día del rango, incluidos los días sin ventas (en cero).
totalsobjectSí—
totals.sales_countintegerSíNúmero de ventas completadas.
totals.subtotalintegerSíPesos colombianos (COP), entero sin decimales.
totals.discountintegerSíPesos colombianos (COP), entero sin decimales.
totals.taxintegerSíPesos colombianos (COP), entero sin decimales.
totals.tip_amountintegerSíPesos colombianos (COP), entero sin decimales.
totals.totalintegerSíPesos colombianos (COP), entero sin decimales.
Ejemplo de respuesta (valores ilustrativos)
{
  "object": "daily_sales_report",
  "timezone": "America/Bogota",
  "currency": "COP",
  "from": "2026-09-28",
  "to": "2026-09-28",
  "days": [
    {
      "date": "2026-09-28",
      "sales_count": 1,
      "subtotal": 25900,
      "discount": 1,
      "tax": 1,
      "tip_amount": 25900,
      "total": 25900
    }
  ],
  "totals": {
    "sales_count": 1,
    "subtotal": 25900,
    "discount": 1,
    "tax": 1,
    "tip_amount": 25900,
    "total": 25900
  }
}

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