# 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

| Nombre | Tipo          | Requerido | Descripción                         |
| ------ | ------------- | --------- | ----------------------------------- |
| `from` | string (date) | Sí        | Primer día (YYYY-MM-DD), inclusive. |
| `to`   | string (date) | Sí        | Último día (YYYY-MM-DD), inclusive. |

## Ejemplo de petición

**curl**

```sh
curl "https://api.posdata.so/public/v1/reports/daily-sales" \
  -H "Authorization: Bearer $POSDATA_API_KEY"
```

**Node.js**

```js
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**

```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
<?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](https://developers.posdata.so/referencia/objetos/#obj-dailysalesreport).

| Campo                | Tipo                                                                                            | Requerido | Descripción                                                             |
| -------------------- | ----------------------------------------------------------------------------------------------- | --------- | ----------------------------------------------------------------------- |
| `object`             | `"daily_sales_report"`                                                                          | Sí        | —                                                                       |
| `timezone`           | `"America/Bogota"`                                                                              | Sí        | —                                                                       |
| `currency`           | `"COP"`                                                                                         | Sí        | —                                                                       |
| `from`               | string (date)                                                                                   | Sí        | —                                                                       |
| `to`                 | string (date)                                                                                   | Sí        | —                                                                       |
| `days`               | arreglo de [DailySalesDay](https://developers.posdata.so/referencia/objetos/#obj-dailysalesday) | Sí        | Un elemento por día del rango, incluidos los días sin ventas (en cero). |
| `totals`             | object                                                                                          | Sí        | —                                                                       |
| `totals.sales_count` | integer                                                                                         | Sí        | Número de ventas completadas.                                           |
| `totals.subtotal`    | integer                                                                                         | Sí        | Pesos colombianos (COP), entero sin decimales.                          |
| `totals.discount`    | integer                                                                                         | Sí        | Pesos colombianos (COP), entero sin decimales.                          |
| `totals.tax`         | integer                                                                                         | Sí        | Pesos colombianos (COP), entero sin decimales.                          |
| `totals.tip_amount`  | integer                                                                                         | Sí        | Pesos colombianos (COP), entero sin decimales.                          |
| `totals.total`       | integer                                                                                         | Sí        | Pesos colombianos (COP), entero sin decimales.                          |

```json
{
  "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](https://developers.posdata.so/referencia/objetos/#obj-error) y un `request_id`. Ramifica por `error.code`, nunca por el mensaje.

### 400Petición inválida (VALIDATION_ERROR, INVALID_JSON, INVALID_CURSOR).

**Respuesta 400**

Cuerpo: un objeto [Error](https://developers.posdata.so/referencia/objetos/#obj-error). Qué significa cada código y qué hacer: [Errores](https://developers.posdata.so/errores/).

VALIDATION_ERRORINVALID_JSONINVALID_CURSOR

### 401Sin API key válida (UNAUTHENTICATED, INVALID_API_KEY, API_KEY_REVOKED, API_KEY_EXPIRED, API_KEY_WRONG_ENVIRONMENT, ACCOUNT_INACTIVE).

**Respuesta 401**

Cuerpo: un objeto [Error](https://developers.posdata.so/referencia/objetos/#obj-error). Qué significa cada código y qué hacer: [Errores](https://developers.posdata.so/errores/).

UNAUTHENTICATEDINVALID_API_KEYAPI_KEY_REVOKEDAPI_KEY_EXPIREDAPI_KEY_WRONG_ENVIRONMENTACCOUNT_INACTIVE

### 403Sin permiso (PLAN_REQUIRED, INSUFFICIENT_SCOPE, BROWSER_REQUESTS_NOT_ALLOWED).

**Respuesta 403**

Cuerpo: un objeto [Error](https://developers.posdata.so/referencia/objetos/#obj-error). Qué significa cada código y qué hacer: [Errores](https://developers.posdata.so/errores/).

PLAN_REQUIREDINSUFFICIENT_SCOPEBROWSER_REQUESTS_NOT_ALLOWED

### 429Límite de peticiones (RATE_LIMITED). Respeta Retry-After.

**Respuesta 429**

Cuerpo: un objeto [Error](https://developers.posdata.so/referencia/objetos/#obj-error). Qué significa cada código y qué hacer: [Errores](https://developers.posdata.so/errores/).

RATE_LIMITED

### 500Error interno (INTERNAL_ERROR). Reintenta y comparte el request_id si persiste.

**Respuesta 500**

Cuerpo: un objeto [Error](https://developers.posdata.so/referencia/objetos/#obj-error). Qué significa cada código y qué hacer: [Errores](https://developers.posdata.so/errores/).

INTERNAL_ERROR

---

Fuente: https://developers.posdata.so/referencia/operations/getdailysales/ · Índice para agentes: https://developers.posdata.so/llms.txt
