Limites de débit Lokalise

VérifiéSûr

Implémentez des patterns de limitation de débit, de backoff et de file d'attente pour l'API Lokalise.

Spar Skills Guide Bot
DeveloppementIntermédiaire
25/07/2026
Claude CodeCodex
#lokalise#rate-limiting#api#retry-logic#nodejs

Recommandé pour

Synthèse automatique

Implémente la limitation de débit, le backoff exponentiel et la mise en file des requêtes pour l'API Lokalise.

Points forts

  • Décrit précisément la limite de 6 requêtes par seconde et l'espacement minimal de 170 ms
  • Fournit des exemples TypeScript prêts à l'emploi avec p-queue et @lokalise/node-api
  • Explique la lecture des en-têtes X-RateLimit et Retry-After
  • Inclut la pagination throttlée pour les opérations en masse

Limites

  • Se concentre sur Node.js/TypeScript et ne fournit pas d'exemples dans d'autres langages
  • Suppose l'utilisation de p-queue et du SDK officiel
  • L'extrait de code de pagination est tronqué dans le SKILL.md
Quand l'utiliser

À utiliser lorsqu'on intègre l'API Lokalise et qu'on doit gérer les erreurs 429, les retries ou le débit des requêtes.

Quand l'éviter

À éviter si l'on travaille avec une autre API ou si l'on cherche une solution de rate limiting générique indépendante de Lokalise.

Analyse de sécurité

Sûr
Score qualité86/100

The skill is pure documentation and TypeScript example code for implementing rate limiting, backoff, and request queuing against the Lokalise API. It declares only Read/Write/Edit tools and contains no shell execution, no network calls that exfiltrate data, no obfuscated payloads, and no instructions to disable safety. API tokens are read from environment variables, which is the correct pattern rather than hardcoding secrets.

Aucun point d'attention détecté

Comment cette analyse est faite

Exemples

Queue Lokalise API calls under 6 req/s
Add a request queue to my Lokalise API calls so we stay under 6 requests per second, and wrap 429 responses with exponential backoff.
Handle 429 with Retry-After
My Lokalise translation export sometimes fails with 429 Too Many Requests. Implement retry logic that respects the Retry-After header and adds jitter.
Throttle bulk key pagination
Write a TypeScript helper that paginates through all Lokalise project keys with throttled requests and exponential backoff on failures.

name: lokalise-rate-limits description: 'Implement Lokalise rate limiting, backoff, and request queuing patterns.

Use when handling rate limit errors, implementing retry logic,

or optimizing API request throughput for Lokalise.

Trigger with phrases like "lokalise rate limit", "lokalise throttling",

"lokalise 429", "lokalise retry", "lokalise backoff".

' allowed-tools: Read, Write, Edit version: 1.14.0 license: MIT author: Jeremy Longshore jeremy@intentsolutions.io tags:

  • saas
  • lokalise
  • api compatibility: Designed for Claude Code, also compatible with Codex and OpenClaw

Lokalise Rate Limits

Overview

Lokalise enforces a strict 6 requests per second rate limit across all API endpoints (https://api.lokalise.com/api2). Exceeding this triggers a 429 Too Many Requests response. This skill covers request queuing with 170ms minimum spacing, exponential backoff for 429 recovery, bulk operation throttling, and proactive quota monitoring via response headers.

Prerequisites

  • @lokalise/node-api SDK installed (npm install @lokalise/node-api)
  • API token configured (read or read/write scope depending on operations)
  • Node.js 18+ for native AbortController support in timeout handling

Instructions

1. Understand the Rate Limit Headers

Every Lokalise API response includes rate limit headers:

X-RateLimit-Limit: 6          # Max requests per second
X-RateLimit-Remaining: 4      # Requests remaining in current window
X-RateLimit-Reset: 1700000000 # Unix timestamp when the window resets
Retry-After: 1                # Seconds to wait (only on 429 responses)

Always read these headers. Never hardcode assumptions about the window — Lokalise may adjust limits per plan tier.

2. Implement a Request Queue with 170ms Spacing

Space requests at minimum 170ms apart (1000ms / 6 = ~167ms, rounded up). Use p-queue for concurrency control:

import PQueue from "p-queue";

const lokaliseQueue = new PQueue({
  concurrency: 1,
  interval: 170,
  intervalCap: 1,
});

async function queuedRequest<T>(fn: () => Promise<T>): Promise<T> {
  return lokaliseQueue.add(fn, { throwOnTimeout: true });
}

// Usage with the SDK
import { LokaliseApi } from "@lokalise/node-api";
const lokalise = new LokaliseApi({ apiKey: process.env.LOKALISE_API_TOKEN });

const keys = await queuedRequest(() =>
  lokalise.keys().list({
    project_id: "123456789.abcdefgh",
    limit: 500,
    page: 1,
  })
);

3. Add Exponential Backoff for 429 Recovery

When a 429 occurs, honor the Retry-After header first. If absent, use exponential backoff with jitter:

async function withBackoff<T>(
  fn: () => Promise<T>,
  maxRetries = 5
): Promise<T> {
  for (let attempt = 0; attempt <= maxRetries; attempt++) {
    try {
      return await fn();
    } catch (error: any) {
      if (error.code === 429 && attempt < maxRetries) {
        const retryAfter = error.headers?.["retry-after"];
        const baseDelay = retryAfter
          ? parseInt(retryAfter, 10) * 1000
          : Math.pow(2, attempt) * 1000;
        const jitter = Math.random() * 500;
        const delay = baseDelay + jitter;

        console.warn(
          `Rate limited. Attempt ${attempt + 1}/${maxRetries}. ` +
          `Waiting ${Math.round(delay)}ms...`
        );
        await new Promise((resolve) => setTimeout(resolve, delay));
        continue;
      }
      throw error;
    }
  }
  throw new Error("Max retries exceeded for Lokalise API request");
}

4. Throttle Bulk Operations

For operations that process many items (listing all keys, bulk translations), paginate with built-in throttling:

async function paginateAll<T>(
  fetchPage: (page: number) => Promise<{ items: T[]; totalPages: number }>
): Promise<T[]> {
  const allItems: T[] = [];
  let page = 1;
  let totalPages = 1;

  do {
    const result = await queuedRequest(() => fetchPage(page));
    allItems.push(...result.items);
    totalPages = result.totalPages;
    page++;
  } while (page <= totalPages);

  return allItems;
}

// Fetch all keys across pages
const allKeys = await paginateAll(async (page) => {
  const response = await lokalise.keys().list({
    project_id: projectId,
    limit: 500, // max per page
    page,
  });
  return {
    items: response.items,
    totalPages: response.totalCount
      ? Math.ceil(response.totalCount / 500)
      : 1,
  };
});

For bulk key creation, batch into groups of 500 (API limit per request) and queue each batch:

async function bulkCreateKeys(
  projectId: string,
  keys: Array<{ key_name: string; platforms: string[] }>
): Promise<void> {
  const batchSize = 500;
  for (let i = 0; i < keys.length; i += batchSize) {
    const batch = keys.slice(i, i + batchSize);
    await queuedRequest(() =>
      lokalise.keys().create({
        project_id: projectId,
        keys: batch,
      })
    );
    console.log(
      `Created keys ${i + 1}-${Math.min(i + batchSize, keys.length)} ` +
      `of ${keys.length}`
    );
  }
}

5. Monitor Quota Proactively

Track remaining quota and preemptively slow down before hitting the limit:

let remainingRequests = 6;
let resetTimestamp = 0;

function updateQuota(headers: Record<string, string>): void {
  remainingRequests = parseInt(headers["x-ratelimit-remaining"] ?? "6", 10);
  resetTimestamp = parseInt(headers["x-ratelimit-reset"] ?? "0", 10);
}

async function throttleIfNeeded(): Promise<void> {
  if (remainingRequests <= 1) {
    const now = Math.floor(Date.now() / 1000);
    const waitSeconds = Math.max(0, resetTimestamp - now) + 0.5;
    console.warn(
      `Quota nearly exhausted (${remainingRequests} remaining). ` +
      `Pausing ${waitSeconds}s until reset.`
    );
    await new Promise((resolve) =>
      setTimeout(resolve, waitSeconds * 1000)
    );
  }
}

Output

  • Request queue enforcing 6 req/sec with 170ms minimum spacing between calls
  • Automatic retry with exponential backoff + jitter on 429 responses
  • Paginated fetching with throttling for bulk data retrieval
  • Proactive throttling when X-RateLimit-Remaining drops to 1

Error Handling

| Header | Description | Action | |--------|-------------|--------| | X-RateLimit-Limit | Max requests per window (always 6) | Use as concurrency ceiling | | X-RateLimit-Remaining | Requests left in current window | Pause proactively when <= 1 | | X-RateLimit-Reset | Unix timestamp of window reset | Sleep until this time on exhaustion | | Retry-After | Seconds to wait (only on 429) | Always honor this value exactly |

If you receive a 429 without Retry-After, default to 1 second then exponential backoff. Never retry more than 5 times — if consistently rate-limited, your architecture needs request consolidation, not more retries.

Examples

Complete Rate-Limited Client

import { LokaliseApi } from "@lokalise/node-api";
import PQueue from "p-queue";

class RateLimitedLokalise {
  private api: LokaliseApi;
  private queue: PQueue;

  constructor(apiKey: string) {
    this.api = new LokaliseApi({ apiKey });
    this.queue = new PQueue({ concurrency: 1, interval: 170, intervalCap: 1 });
  }

  async request<T>(fn: (api: LokaliseApi) => Promise<T>): Promise<T> {
    return this.queue.add(
      () => withBackoff(() => fn(this.api)),
      { throwOnTimeout: true }
    );
  }
}

// Usage
const client = new RateLimitedLokalise(process.env.LOKALISE_API_TOKEN!);
const keys = await client.request((api) =>
  api.keys().list({ project_id: "123456789.abcdefgh", limit: 500 })
);

CLI with Rate Limiting

# The lokalise2 CLI respects rate limits internally, but for scripted
# loops you need manual spacing:
for project_id in $(lokalise2 project list --token $TOKEN --format json \
  | jq -r '.[].project_id'); do
  lokalise2 file download \
    --token "$LOKALISE_API_TOKEN" \
    --project-id "$project_id" \
    --format json \
    --dest ./locales/"$project_id"/
  sleep 0.2  # 200ms spacing
done

Resources

Next Steps

For handling specific API errors beyond rate limits, see lokalise-common-errors.

Du fichier au premier essai

Le téléchargement contient exactement le contenu affiché sur cette fiche. Cette copie peut différer de la dernière version du dépôt source.

Consulter la source et ses fichiers annexes

Ce téléchargement contient uniquement SKILL.md. Les scripts, références, modèles et dépendances éventuels ne sont pas inclus. Récupérez les fichiers nécessaires depuis la source en conservant leur arborescence avant de poursuivre.

1. Télécharger le fichier

Télécharger SKILL.md

Depuis la racine d’un projet de test, enregistrez le fichier sous .skill-downloads/lokalise-rate-limits-mrzxuqzx/SKILL.md, ou utilisez la commande suivante. Ce dossier sert à examiner la skill avant son installation.

Commande pour macOS/Linux ou WSL : un shell POSIX et curl sont nécessaires. Sous Windows sans WSL, utilisez le bouton de téléchargement et créez le dossier manuellement.

mkdir -p '.skill-downloads/lokalise-rate-limits-mrzxuqzx' && curl --fail --show-error --location 'https://skills-guides.com/api/skills/lokalise-rate-limits-mrzxuqzx/download' --output '.skill-downloads/lokalise-rate-limits-mrzxuqzx/SKILL.md.part' && mv '.skill-downloads/lokalise-rate-limits-mrzxuqzx/SKILL.md.part' '.skill-downloads/lokalise-rate-limits-mrzxuqzx/SKILL.md'

2. Vérifier les prérequis

Lisez SKILL.md avant de l’utiliser. Si le fichier cite des scripts ou services externes, examinez-les et préparez les accès nécessaires dans votre environnement de test.

Environnement déclaré par l’auteur : Designed for Claude Code, also compatible with Codex and OpenClaw

Outils déclarés par l’auteur (à vérifier dans votre agent) : Read, Write, Edit

Extrait original : Prerequisites
  • @lokalise/node-api SDK installed (npm install @lokalise/node-api)
  • API token configured (read or read/write scope depending on operations)
  • Node.js 18+ for native AbortController support in timeout handling

Les plateformes de la fiche sont des indications du catalogue. Les chemins ci-dessous suivent la documentation des outils ; ils ne prouvent pas que cette skill y a été exécutée. Aucune version minimale de ces outils n’est attestée pour cette fiche.

3. Charger la skill

Après vérification, copiez le dossier complet dans le projet avec l’une des commandes ci-dessous, puis ouvrez une nouvelle session de l’outil. La commande s’arrête si un dossier du même nom existe déjà : comparez les fichiers avant de le remplacer.

Claude Code
test -f '.skill-downloads/lokalise-rate-limits-mrzxuqzx/SKILL.md' && test -s '.skill-downloads/lokalise-rate-limits-mrzxuqzx/SKILL.md' && mkdir -p '.claude/skills' && test ! -e '.claude/skills/lokalise-rate-limits' && cp -R '.skill-downloads/lokalise-rate-limits-mrzxuqzx' '.claude/skills/lokalise-rate-limits'

Codex
test -f '.skill-downloads/lokalise-rate-limits-mrzxuqzx/SKILL.md' && test -s '.skill-downloads/lokalise-rate-limits-mrzxuqzx/SKILL.md' && mkdir -p '.agents/skills' && test ! -e '.agents/skills/lokalise-rate-limits' && cp -R '.skill-downloads/lokalise-rate-limits-mrzxuqzx' '.agents/skills/lokalise-rate-limits'

OpenSkills

OpenSkills doit déjà être installé. La procédure locale install/read est contrôlée avec OpenSkills 1.5.0, qui exige Node.js ≥ 20.6.0. Aucun slug du catalogue n’est résolu automatiquement.

Installation officielle d’OpenSkills
openskills install './.skill-downloads/lokalise-rate-limits-mrzxuqzx'

openskills read 'lokalise-rate-limits-mrzxuqzx'

La lecture doit afficher le contenu du fichier installé et son dossier de base. Elle ne lance ni la skill ni ses dépendances.

Pour un agent qui lit AGENTS.md, synchronisez ensuite l’index. Cette commande modifie AGENTS.md : relisez le diff avant de l’utiliser.

openskills sync

Mode manuel ou autre outil : joignez SKILL.md à une conversation, ou ouvrez-le dans un agent capable de lire les fichiers. Ajoutez les ressources annexes nécessaires. Il n’existe pas de dossier universel reconnu par tous les outils.

4. Faire un premier essai

Utilisez une entrée courte et fictive : un endpoint d’API, un petit document ou un brief d’interface. Dans une nouvelle conversation, joignez le fichier ou donnez son chemin à l’agent, puis adaptez cette demande :

Lis .skill-downloads/lokalise-rate-limits-mrzxuqzx/SKILL.md et applique ses instructions à cet exemple : [décrire une entrée de test]. Indique les fichiers, dépendances ou accès qui manquent. Produis le résultat demandé par la skill sans inventer de données ni exécuter de script non examiné.

Résultat attendu : une sortie correspondant aux instructions de la skill, ou une liste précise des prérequis manquants. Une simple confirmation de lecture ne valide pas le premier usage. Si une ressource externe est indisponible, ce parcours reste à tester.

Skills similaires