Saltar al contenido

Límites de velocidad

MoreLogin aplica límites en el gateway para proteger la API. La configuración de producción confirmada para API y Open API es de 200 solicitudes por minuto con una capacidad burst de 10.


Contrato de implementación actual

ElementoComportamiento en producción
AlgoritmoGCRA (Generic Cell Rate Algorithm)
Configuración de la APIrate=200, burst=10, period=1m
Configuración de la Open APIrate=200, burst=10, period=1m
Recuperación sostenidaUn permiso cada 0,3 segundos, o aproximadamente 3,33 permisos por segundo
BurstHasta 10 permisos pueden estar disponibles de inmediato
Clave de ámbito de la Open APIRuta de la petición + ID de equipo
Clave de ámbito de la APIRuta de la petición + ID de equipo; si no hay ID de equipo, recurre al ID de API y luego a la IP del cliente
Anulaciones en tiempo de ejecuciónReglas de API por ruta o por equipo pueden anular la configuración predeterminada
Peticiones por lotesUna petición HTTP consume un permiso del gateway; el número de elementos no lo usa el limitador

These are the confirmed production gateway values, not the Java fallback (rate=1, burst=1, period=1s). At rate=200 over 60 seconds, one permit is restored every 0.3 seconds (approximately 3.33 per second), and up to 10 permits can accumulate. The localhost Local API does not traverse this public cloud gateway.

  • rate: permits restored during period
  • burst: maximum permits immediately available
  • period: restoration interval

Respuesta de límite

{
  "code": 35000,
  "msg": "API requests are too frequent. Please try again later.",
  "data": null,
  "requestId": "request-trace-id"
}
  • The current response writer does not explicitly set HTTP 429; inspect body code even when HTTP status is 200.
  • No Retry-After, RateLimit-*, or X-RateLimit-* headers are currently emitted.
  • Handle HTTP 429 defensively for future gateway or edge-proxy changes.
  • The message language can vary; branch on code, not msg.

Reintentos seguros

Retry reads with exponential backoff and jitter. For writes, query current state before retrying. A general public idempotency-key header is not currently documented.

import random
import time
import requests

def api_request_with_retry(url, payload, headers=None, max_retries=4):
    for attempt in range(max_retries):
        response = requests.post(url, json=payload, headers=headers, timeout=30)
        try:
            body = response.json()
        except ValueError:
            body = {}

        limited = response.status_code == 429 or body.get("code") == 35000
        if not limited:
            return response

        retry_after = response.headers.get("Retry-After")
        delay = float(retry_after) if retry_after and retry_after.isdigit() else min(2 ** attempt, 30) + random.uniform(0, 0.5)
        time.sleep(delay)

    raise RuntimeError("Rate limit retry budget exhausted")

Reducir solicitudes

  • Prefer batch endpoints when their semantics match the operation.
  • Almacena en caché datos de referencia como zonas horarias, idiomas, núcleos y modelos de dispositivo.
  • Poll asynchronous operations with increasing intervals and stop at a terminal state.
  • Do not blindly retry create, purchase, upload-registration, or schedule-creation requests.