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

# Limites de Requisições

> Entenda como os limites de requisições funcionam na API First Answer e como lidar com eles corretamente.

## Como Funciona

A API First Answer aplica limites de requisições **por projeto** em uma janela deslizante **por minuto**. Todas as chaves de API dentro do mesmo projeto compartilham o mesmo contador de limite de requisições.

O limite de requisições do seu projeto é determinado pelo seu plano.

## Cabeçalhos de Limite de Requisições

Toda resposta da API inclui cabeçalhos para ajudá-lo a acompanhar seu uso:

| Cabeçalho               | Descrição                                                                         |
| ----------------------- | --------------------------------------------------------------------------------- |
| `X-RateLimit-Limit`     | Máximo de requisições permitidas por minuto                                       |
| `X-RateLimit-Remaining` | Requisições restantes na janela atual                                             |
| `Retry-After`           | Segundos para esperar antes de fazer outra requisição (apenas em respostas `429`) |

## Excedendo o Limite

Quando você excede seu limite de requisições, a API retorna uma resposta `429 Too Many Requests`:

```json 429 theme={null}
{
  "error": {
    "code": "RATE_LIMIT_EXCEEDED",
    "message": "Rate limit exceeded.",
    "retry_after_seconds": 23
  }
}
```

O campo `retry_after_seconds` indica exatamente quantos segundos esperar antes de tentar novamente.

## Lidando com Limites de Requisições

### Tentar Novamente com Backoff

A abordagem mais simples é respeitar o valor de `retry_after_seconds`:

<CodeGroup>
  ```python Python theme={null}
  import time
  import requests

  API_KEY = "SUA_CHAVE_API"
  BASE_URL = "https://api.firstanswer.ai/v1"

  def api_request(endpoint):
      response = requests.get(
          f"{BASE_URL}{endpoint}",
          headers={"api-key": API_KEY},
      )

      if response.status_code == 429:
          retry_after = response.json()["error"]["retry_after_seconds"]
          print(f"Limite excedido. Tentando novamente em {retry_after}s...")
          time.sleep(retry_after)
          return api_request(endpoint)

      return response.json()
  ```

  ```javascript JavaScript theme={null}
  const API_KEY = "SUA_CHAVE_API";
  const BASE_URL = "https://api.firstanswer.ai/v1";

  async function apiRequest(endpoint) {
    const response = await fetch(`${BASE_URL}${endpoint}`, {
      headers: { "api-key": API_KEY },
    });

    if (response.status === 429) {
      const { error } = await response.json();
      const retryAfter = error.retry_after_seconds;
      console.log(`Limite excedido. Tentando novamente em ${retryAfter}s...`);
      await new Promise((r) => setTimeout(r, retryAfter * 1000));
      return apiRequest(endpoint);
    }

    return response.json();
  }
  ```
</CodeGroup>

### Distribuir Requisições ao Longo do Tempo

Se você precisa fazer muitas requisições, distribua-as uniformemente dentro da janela de limite em vez de enviá-las em rajadas:

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

API_KEY = "SUA_CHAVE_API"
BASE_URL = "https://api.firstanswer.ai/v1"
RATE_LIMIT = 10  # requisições por minuto
DELAY = 60 / RATE_LIMIT  # 6 segundos entre requisições

endpoints = [
    "/brands/",
    "/monitored-prompts/",
    "/cited-sources/",
    "/monitored-competitors/",
    "/dashboard/",
]

for endpoint in endpoints:
    response = requests.get(
        f"{BASE_URL}{endpoint}",
        headers={"api-key": API_KEY},
    )
    print(f"{endpoint}: {response.status_code}")
    time.sleep(DELAY)
```

## Boas Práticas

<CardGroup cols={2}>
  <Card title="Cache de respostas" icon="database">
    Armazene respostas da API localmente e reutilize-as quando os dados não tiverem mudado. A maioria dos dados de monitoramento é atualizada diária ou semanalmente.
  </Card>

  <Card title="Use paginação com sabedoria" icon="list">
    Cada página retorna até 100 itens por padrão. Use os parâmetros `page` e `per_page` para controlar o tamanho da página e iterar pelos resultados eficientemente.
  </Card>

  <Card title="Solicite apenas o necessário" icon="filter">
    Direcione endpoints e recursos específicos em vez de buscar tudo em cada sincronização.
  </Card>

  <Card title="Monitore seu uso" icon="chart-line">
    Acompanhe respostas `429` nos logs da sua aplicação para identificar quando você está se aproximando dos seus limites.
  </Card>
</CardGroup>

## Precisa de Limites Maiores?

Se sua integração requer um limite de requisições maior, [entre em contato com nossa equipe](mailto:support@firstanswer.ai) para discutir planos Enterprise com limites personalizados.
