# Límites de tarifas y simultaneidad

Tripo API aplica límites de velocidad y límites de concurrencia para garantizar la estabilidad del servicio y el uso justo.

## Límites de tarifas

Los límites de tarifas restringen la cantidad de solicitudes API que puede realizar dentro de un período de tiempo.

### Reglas de límite

- Los límites de tarifas se calculan en el nivel **API Key**
- Los límites varían según el punto final. Los puntos finales de generación, como `/v3/generation/*`, tienen límites más bajos, mientras que los puntos finales de consulta, como `/v3/tasks/*`, tienen límites más altos.
- Cuando se excede un límite, API devuelve HTTP `429 Too Many Requests` con el código de error `1007`.

### Encabezados de respuesta

Cada respuesta API incluye encabezados de respuesta relacionados con el límite de velocidad:

| Encabezado de respuesta | Descripción |
| :-: | :-: |
| `X-RateLimit-Limit` | Número máximo de solicitudes permitidas en la ventana de tiempo actual |
| `X-RateLimit-Remaining` | Número de solicitudes restantes disponibles en el período de tiempo actual |
| `X-RateLimit-Reset` | Marca de tiempo de Unix, en segundos, cuando se restablece la ventana de límite de velocidad |

### Respuesta cuando la tasa es limitada

```json
{
  "code": 1007,
  "message": "Rate limit exceeded, you've generated too many requests in a short amount of time",
  "suggestion": "Please wait for a while and try again"
}
```

---

## Límites de simultaneidad

Los límites de simultaneidad restringen la cantidad de tareas que se pueden ejecutar **simultáneamente** en su cuenta. Esto es diferente de los límites de velocidad: los límites de velocidad limitan la frecuencia de solicitud, mientras que los límites de concurrencia limitan las tareas de ejecución paralela.

### Cómo funciona

- La simultaneidad se calcula a nivel de **cuenta** (no según API Key)
- Se aplican límites **por categoría de tarea**: cada categoría tiene su propio grupo de simultaneidad independiente.
- Cuando la simultaneidad de una categoría está llena, la creación de una nueva tarea para esa categoría devuelve HTTP `429` con el código de error `2000`.
- Las tareas de otras categorías **no se ven afectadas**: aún puedes crear tareas en categorías que tengan espacios disponibles

### Límites predeterminados

Todos los usuarios comienzan con una simultaneidad predeterminada de **10** por categoría; algunas categorías tienen límites diferentes (consulte la tabla a continuación).

| categoría | Tipos de tareas incluidas | Simultaneidad predeterminada |
| :-: | :-: | :-: |
| Generación 3D: Serie H | texto a modelo (H), imagen a modelo (H), vista múltiple a modelo (H) | 10 |
| Generación 3D: Serie P | texto a modelo (P), imagen a modelo (P), vista múltiple a modelo (P) | 5 |
| Generación de imágenes | texto a imagen, imagen a imagen, imagen a vista múltiple, edición de vista múltiple | 1 |
| Animación | auto-rig, rig-check, animación-retarget | 10 |
| Procesamiento de modelos | textura, convertir formato, refinar | 5 |
| Operaciones de malla | segmentación, finalización, retopología | 10 |

> **Nota:** Las tareas dentro de la misma categoría comparten el grupo de simultaneidad. Por ejemplo, si tiene 10 tareas de texto a modelo de la serie H en ejecución, no puede iniciar una tarea de imagen a modelo de la serie H hasta que se complete una. Sin embargo, aún puede iniciar tareas de generación de imágenes o de la serie P.

### Respuesta cuando se excede la simultaneidad

```json
{
  "code": 2000,
  "message": "You have exceeded the limit of generation",
  "suggestion": "Try again later. You can also check `Retry-After` header."
}
```

La respuesta incluye un encabezado `Retry-After` que indica cuántos segundos esperar antes de volver a intentarlo.

### Aumento de la simultaneidad

Para solicitar límites de concurrencia más altos, comuníquese con nuestro equipo a través del canal de soporte. La simultaneidad personalizada se puede configurar por categoría según sus necesidades de uso.

---

## Manejando 429 respuestas

### Python

```python
import time
import requests

def request_with_backoff(method, url, headers, json=None, max_retries=5):
    for attempt in range(max_retries):
        response = requests.request(method, url, headers=headers, json=json)

        if response.status_code != 429:
            return response

        retry_after = response.headers.get("Retry-After")
        reset_at = response.headers.get("X-RateLimit-Reset")

        if retry_after:
            wait = int(retry_after)
        elif reset_at:
            wait = max(int(reset_at) - int(time.time()), 1)
        else:
            wait = 2 ** attempt

        print(f"429 triggered. Waiting {wait} seconds (attempt {attempt + 1})...")
        time.sleep(wait)

    raise Exception("Maximum retry attempts exhausted")
```

### JavaScript

```javascript
async function requestWithBackoff(url, options, maxRetries = 5) {
  for (let attempt = 0; attempt < maxRetries; attempt++) {
    const response = await fetch(url, options);

    if (response.status !== 429) {
      return response;
    }

    const retryAfter = response.headers.get("Retry-After");
    const resetAt = response.headers.get("X-RateLimit-Reset");
    const wait = retryAfter
      ? Number(retryAfter)
      : resetAt
        ? Math.max(Number(resetAt) - Math.floor(Date.now() / 1000), 1)
        : 2 ** attempt;

    console.log(`429 triggered. Waiting ${wait} seconds (attempt ${attempt + 1})...`);
    await new Promise(resolve => setTimeout(resolve, wait * 1000));
  }

  throw new Error("Maximum retry attempts exhausted");
}
```

## Mejores prácticas

- **Implementar reintentos de retroceso exponencial**: Espere 1 segundo inicialmente, duplique la espera cada vez y limite la espera máxima a 32 segundos.
- **Prefiera los encabezados `Retry-After` y `X-RateLimit-Reset`**: espere exactamente hasta que se restablezca la ventana de límite
- **Diseño para simultaneidad a nivel de categoría**: distribuya las cargas de trabajo entre categorías cuando sea posible; la generación de imágenes y la generación 3D tienen grupos separados
- **Utilice lotes API**: utilice `POST /v3/tasks/list` en lugar de varias solicitudes `GET /v3/tasks/{task_id}`
- **Encuesta con prudencia**: cuando esperes a que se complete la tarea, realiza una encuesta a intervalos razonables (cada 1 o 2 segundos) en lugar de inundar el punto final de la consulta.
