# Historial

## GET /api/quantis/v2/rates/history/

Devuelve las **tasas de cierre** de fin de día más recientes — una entrada por día, hasta los últimos 30 días — de la más nueva a la más antigua. Una tasa de cierre es la instantánea tomada al final de cada día (zona horaria America/Caracas). Cada entrada se agrupa igual que los endpoints en vivo: un bloque `bcv` (las tasas oficiales del BCV, misma estructura que [GET /rates/bcv/](/es/quantis/v2/rates/bcv/)) y un bloque `markets` (la tasa USDT P2P de Binance más el promedio y la diferencia calculados, misma estructura que [GET /rates/markets/](/es/quantis/v2/rates/markets/)). Todas las tasas están cotizadas en Bolívar venezolano (VES).

| | |
|---|---|
| **Método** | `GET` |
| **URL** | `https://app.vzla.io/api/quantis/v2/rates/history/` |
| **Autenticación** | `Authorization: Bearer vzlaio_...` |
| **Parámetros** | Ninguno |

### Solicitud

```bash
curl --request GET \
  --url 'https://app.vzla.io/api/quantis/v2/rates/history/' \
  --header 'Authorization: Bearer vzlaio_TU_TOKEN_AQUI'
```

---

### Respuesta

#### `data`

Un arreglo de hasta 30 entradas de tasas de cierre, ordenadas de la más nueva a la más antigua.

| Campo | Tipo | Descripción |
|---|---|---|
| `date` | string (fecha ISO 8601) | La fecha de Caracas de esta tasa de cierre, p. ej. `"2026-06-17"` |
| `timestamp` | string (datetime ISO 8601) | Cuándo se registró la tasa de cierre |
| `bcv` | object | Tasas oficiales del BCV — misma estructura que [GET /rates/bcv/](/es/quantis/v2/rates/bcv/) |
| `markets` | object | Tasa USDT de Binance más las tasas de referencia calculadas — misma estructura que [GET /rates/markets/](/es/quantis/v2/rates/markets/) |
| `banks` | object | Promedios de compra/venta bancarios para USD entre los bancos publicadores — ver más abajo |
| `badges` | object | Indicadores `{ is_bank_holiday, is_weekend }` para esa fecha |

Cada entrada reutiliza las etiquetas y la estructura de los endpoints en vivo, de modo que el historial se lee con el mismo vocabulario que el cliente ya conoce.

#### `bcv`

| Campo | Tipo | Descripción |
|---|---|---|
| `rates` | object | Mapa de código de moneda → objeto de tasa. Claves: `USD`, `EUR` |

#### `markets`

| Campo | Tipo | Descripción |
|---|---|---|
| `usdt` | object | Tasa USDT P2P de Binance (objeto de tasa + `market`) |
| `computed.average` | object | Punto medio entre la tasa BCV USD y la tasa USDT |
| `computed.difference` | object | USDT menos BCV USD (el valor va en `amount`) |

#### `banks`

Promedios de compra/venta en USD calculados entre los bancos que publicaron tasas para el
día de cierre (con una ventana de gracia de un día hábil de publicación). Los fines de semana
y días feriados bancarios heredan los valores del último día hábil anterior.

| Campo | Tipo | Descripción |
|---|---|---|
| `USD.buy_average` | object | Precio promedio de COMPRA entre los bancos — `{ rate, indicator_pct, indicator_amount }` |
| `USD.sell_average` | object | Precio promedio de VENTA entre los bancos — `{ rate, indicator_pct, indicator_amount }` |
| `USD.bank_names` | string[] | Nombres de los bancos incluidos en los promedios |

**Objeto de tasa** (entradas bajo `bcv.rates`, `markets.usdt` y `markets.computed.*`)

| Campo | Tipo | Descripción |
|---|---|---|
| `rate` | string \| null | VES por 1 unidad (`difference` usa `amount` en su lugar) |
| `indicator_pct` | string \| null | Variación porcentual respecto a la tasa de cierre anterior |
| `indicator_amount` | string \| null | Variación absoluta respecto a la tasa de cierre anterior |
| `market` | string | Solo en `markets.usdt` — siempre `"Binance"` |

#### `meta`

| Campo | Tipo | Descripción |
|---|---|---|
| `source` | string | Siempre `"closing"` |
| `currency_quote` | string | Siempre `"VES"` — todas las tasas están cotizadas en Bolívar venezolano |
| `count` | number | Cantidad de entradas devueltas (0–30) |
| `window_days` | number | Siempre `30` — la ventana máxima servida |

---

### Encabezados de respuesta

| Encabezado | Descripción |
|---|---|
| `X-API-Version` | `2.0` |
| `X-Quota-Limit` | Tu límite mensual de solicitudes |
| `X-Quota-Remaining` | Solicitudes restantes este mes |
| `X-Quota-Reset` | Timestamp ISO 8601 del próximo reinicio de cuota |
| `X-Request-ID` | UUID de esta solicitud |

---

### Ejemplo de respuesta

```json
{
  "data": [
    {
      "date": "2026-06-17",
      "timestamp": "2026-06-17T23:59:01.482931+00:00",
      "bcv": {
        "rates": {
          "USD": {
            "rate": "493.37650000",
            "indicator_pct": "0.78066864",
            "indicator_amount": "3.82180000"
          },
          "EUR": {
            "rate": "577.52186207",
            "indicator_pct": "0.57960395",
            "indicator_amount": "3.32804999"
          }
        }
      },
      "markets": {
        "usdt": {
          "rate": "612.10000000",
          "indicator_pct": "0.67320000",
          "indicator_amount": "4.10000000",
          "market": "Binance"
        },
        "computed": {
          "average": {
            "rate": "552.73825000",
            "indicator_pct": "0.71840000",
            "indicator_amount": "3.96090000"
          },
          "difference": {
            "amount": "118.72350000",
            "indicator_pct": "0.23480000",
            "indicator_amount": "0.27820000"
          }
        }
      },
      "banks": {
        "USD": {
          "buy_average": {
            "rate": "612.10000000",
            "indicator_pct": "0.67320000",
            "indicator_amount": "4.10000000"
          },
          "sell_average": {
            "rate": "618.40000000",
            "indicator_pct": "0.71000000",
            "indicator_amount": "4.36000000"
          },
          "bank_names": ["BBVA Provincial", "Banesco", "Mercantil"]
        }
      },
      "badges": {
        "is_bank_holiday": false,
        "is_weekend": false
      }
    }
  ],
  "meta": {
    "source": "closing",
    "currency_quote": "VES",
    "count": 30,
    "window_days": 30
  }
}
```

---

### Códigos de estado HTTP

| Código | Significado |
|---|---|
| `200 OK` | Éxito. |
| `401 Unauthorized` | Token ausente o inválido. |
| `405 Method Not Allowed` | Solo se admite GET. |
| `429 Too Many Requests` | Cuota mensual agotada. |
| `500 Internal Server Error` | Error del servidor. Reintenta después de un momento. |

#### 401 — sin encabezado Authorization

```json
{
  "error": {
    "code": "auth_missing",
    "message": "Authentication credentials were not provided"
  }
}
```

#### 401 — token inválido

```json
{
  "error": {
    "code": "auth_token_unknown",
    "message": "Invalid token format"
  }
}
```

#### 429

```json
{
  "error": {
    "code": "quota_exceeded",
    "message": "Monthly quota limit exceeded.",
    "details": {
      "reset_at": "2026-06-01T00:00:00Z"
    }
  }
}
```
**Note:** Una nueva tasa de cierre se publica una vez al día al final del día (America/Caracas). El historial no cambia durante el día, por lo que este endpoint tiene caché hasta el final del día actual de Caracas.