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

# Errores

> Formato, códigos y qué hacer con cada uno.

Todos los errores tienen la misma forma:

```json theme={null}
{
  "error": {
    "codigo": "sin_creditos",
    "mensaje": "Has agotado los créditos de este mes. Amplía tu plan para seguir."
  }
}
```

<Tip>
  Programa contra `codigo`, nunca contra `mensaje`. El código es estable; el
  mensaje puede reescribirse o traducirse en cualquier momento.
</Tip>

## Tabla de códigos

| HTTP | `codigo`                | Qué hacer                                           |
| ---- | ----------------------- | --------------------------------------------------- |
| 400  | `peticion_invalida`     | Revisa el cuerpo. No reintentes: fallará igual.     |
| 400  | `falta_organizacion`    | Solo afecta a claves internas.                      |
| 401  | `sin_credenciales`      | Falta la cabecera `Authorization`.                  |
| 401  | `clave_invalida`        | Clave mal escrita o revocada. No reintentes.        |
| 402  | `sin_creditos`          | Amplía el plan o espera al siguiente periodo.       |
| 404  | `negocio_no_encontrado` | Ese negocio no es de tu organización.               |
| 409  | `agente_no_desplegado`  | El negocio existe pero aún no está `activo`.        |
| 502  | `agente_no_disponible`  | Fallo temporal. **Reintenta**; no se te ha cobrado. |
| 500  | `error_interno`         | Fallo nuestro. Reintenta y avísanos si persiste.    |

## Qué reintentar

Solo `502` y `500`, y con espera creciente:

```javascript theme={null}
async function conReintento(fn, intentos = 3) {
  for (let i = 0; i < intentos; i++) {
    try {
      return await fn();
    } catch (e) {
      // Un 4xx no mejora reintentando: la petición es incorrecta.
      if (e.estado < 500) throw e;
      if (i === intentos - 1) throw e;
      await new Promise((r) => setTimeout(r, 2 ** i * 1000));
    }
  }
}
```

Reintentar un `401` o un `404` solo gasta tiempo: el resultado será el mismo.

## Sobre el 404

Devolvemos `404` tanto si el negocio no existe como si existe pero es de otra
organización. Distinguirlos te diría qué negocios hay dados de alta en
Booklift, así que no lo hacemos. No es un fallo de la documentación.
