> ## Documentation Index
> Fetch the complete documentation index at: https://docs.linahealthcareplatform.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Límites de tasa (Rate Limits)

> Información sobre los límites de peticiones a la API de LINA y cómo gestionarlos correctamente.

## Límites por plan

| Plan           | Límite           | Ventana    |
| -------------- | ---------------- | ---------- |
| **Standard**   | 100 peticiones   | por minuto |
| **Enterprise** | 1.000 peticiones | por minuto |

Los límites se aplican por API key. Si necesitas un límite superior, contacta con [soporte@linahealthcareplatform.com](mailto:soporte@linahealthcareplatform.com).

## Headers de respuesta

Cada respuesta de la API incluye headers que indican el estado actual de tu cuota:

| Header                  | Descripción                                               |
| ----------------------- | --------------------------------------------------------- |
| `X-RateLimit-Limit`     | Número máximo de peticiones permitidas por ventana        |
| `X-RateLimit-Remaining` | Peticiones restantes en la ventana actual                 |
| `X-RateLimit-Reset`     | Timestamp Unix (segundos) en que se restablece la ventana |

**Ejemplo de headers:**

```
HTTP/1.1 200 OK
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 73
X-RateLimit-Reset: 1747224120
```

## Respuesta 429 (Too Many Requests)

Cuando superas el límite, recibirás un error `429`:

```json theme={null}
{
  "error": {
    "code": "rate_limit_exceeded",
    "message": "Has superado el límite de peticiones. Inténtalo de nuevo en 34 segundos.",
    "retryAfter": 34
  }
}
```

El header `Retry-After` también indica los segundos de espera:

```
HTTP/1.1 429 Too Many Requests
Retry-After: 34
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1747224120
```

## Gestión recomendada

<CodeGroup>
  ```javascript Node.js theme={null}
  async function fetchWithRetry(url, options, maxRetries = 3) {
    for (let attempt = 0; attempt <= maxRetries; attempt++) {
      const response = await fetch(url, options);

      if (response.status === 429) {
        const retryAfter = parseInt(response.headers.get('Retry-After') || '60', 10);
        console.log(`Rate limited. Reintentando en ${retryAfter}s...`);
        await new Promise(resolve => setTimeout(resolve, retryAfter * 1000));
        continue;
      }

      return response;
    }
    throw new Error('Se ha superado el número máximo de reintentos');
  }
  ```

  ```python Python theme={null}
  import time
  import requests

  def fetch_with_retry(url, headers, max_retries=3):
      for attempt in range(max_retries + 1):
          response = requests.get(url, headers=headers)

          if response.status_code == 429:
              retry_after = int(response.headers.get("Retry-After", 60))
              print(f"Rate limited. Reintentando en {retry_after}s...")
              time.sleep(retry_after)
              continue

          return response
      raise Exception("Se ha superado el número máximo de reintentos")
  ```
</CodeGroup>

## Buenas prácticas

<CardGroup cols={2}>
  <Card title="Implementa backoff exponencial" icon="clock">
    Si recibes un 429, espera el tiempo indicado en `Retry-After` antes de reintentar.
  </Card>

  <Card title="Cachea respuestas" icon="database">
    Almacena en caché las respuestas que no cambian frecuentemente (formularios, configuración).
  </Card>

  <Card title="Usa webhooks" icon="bell">
    En lugar de hacer polling, configura [webhooks](/guides/webhooks) para recibir actualizaciones.
  </Card>

  <Card title="Peticiones en lote" icon="layer-group">
    Agrupa operaciones cuando sea posible para reducir el número de peticiones.
  </Card>
</CardGroup>

<Note>
  Los endpoints de webhooks (recibir eventos) no cuentan para tu límite de peticiones. Solo las llamadas salientes a la API consumen cuota.
</Note>
