Límites de uso e idempotencia

Límites de uso

Todos los planes tienen los mismos límites, compartidos por todas las claves de API de tu agencia:

  • 10 solicitudes por segundo en ráfagas y 300 por minuto sostenidas, para todo excepto la ingesta;
  • 60 por minuto para POST /v1/leads:ingest, con un límite propio, para que una carga histórica nunca ralentice tus otras integraciones.

Cada respuesta te dice cómo vas, en el formato de la IETF y en el formato X- habitual:

RateLimit-Policy: "burst";q=10;w=1, "minute";q=300;w=60
RateLimit: "minute";r=287;t=4
X-RateLimit-Limit: 300
X-RateLimit-Remaining: 287
X-RateLimit-Reset: 4

RateLimit y X-RateLimit-* describen el límite más ajustado: r solicitudes restantes y t segundos hasta que se recupere por completo.

Cuando se agota un límite, la respuesta es 429 con Retry-After en segundos. Espera ese tiempo y reintenta; baja el ritmo cuando Remaining esté bajo.

Idempotencia

Las redes fallan a mitad de una solicitud. Para que reintentar un POST sea seguro, envía un header Idempotency-Key: cualquier cadena única de hasta 255 caracteres, como un UUID o el id del registro en tu sistema:

curl https://api.letsrealty.io/v1/leads:ingest \
  -H "Authorization: Bearer $LETSREALTY_API_KEY" \
  -H "Idempotency-Key: crm-export-000123" \
  -H "Content-Type: application/json" \
  -d '{ "source": "CRM anterior", "type": "registration", "person": { "name": "Luis", "phone": "8888 0000" } }'
  • La primera solicitud con una clave se ejecuta normalmente y su respuesta se guarda durante 24 horas.
  • Un reintento con la misma clave y el mismo cuerpo recibe la respuesta guardada —mismo estado y mismo cuerpo— con Idempotent-Replayed: true. Nada se ejecuta dos veces.
  • Un reintento mientras la primera todavía se ejecuta recibe 409; vuelve a intentarlo en un momento.
  • Reutilizar una clave con un cuerpo distinto recibe 422.
  • Una solicitud que falla la validación no guarda nada, así que puedes corregirla y reenviarla con la misma clave.

Las claves de idempotencia se asocian a la clave de API que las envió. Todos los POST de la API aceptan una.