Matchai Docs

Limites de débit

Les limites actuelles du serveur MCP public et de la recherche d'inscriptions, comment les lire, et les limites et en-têtes RateLimit de l'API Matchai.

Les limites gardent Matchai rapide pour tout le monde. Cette page indique ce que les interfaces publiques permettent aujourd'hui, et comment l'API Matchai prévue signalera et appliquera ses limites.

Sur les interfaces publiques

Ces limites s'appliquent aux interfaces que vous pouvez utiliser dès aujourd'hui sans clé. Chacune est comptée par adresse appelante : l'adresse d'où proviennent vos requêtes. Les appelants qui partagent une même adresse, comme le réseau d'un bureau ou un assistant hébergé, partagent un seul quota.

InterfaceLimiteQuand vous dépassez la limite
Appels d'outils du serveur MCP (tools/call à https://matchai.co/mcp)600 par minuteL'appel renvoie un résultat d'outil avec isError: true et un message qui vous invite à réessayer dans une minute. Le statut HTTP reste 200.
Recherche d'inscriptions (https://matchai.co/ask, GET et POST confondus)60 par minute429 avec l'erreur rate_limited et un Retry-After de 60 secondes.

Quelques précisions :

  • La limite du serveur MCP ne compte que tools/call. L'établissement de la liaison, tools/list et les autres méthodes ne sont pas comptés. C'est une protection contre les abus, fixée assez haut pour qu'une plateforme d'assistant très sollicitée ne l'atteigne pas.
  • La recherche d'inscriptions peut aussi répondre 503. Quand la recherche est temporairement indisponible, elle répond 503 avec l'erreur unavailable et un Retry-After de 30 secondes. Attendez ce délai, puis réessayez.
  • Les pages lisibles par l'IA n'ont pas de limite chiffrée par minute, mais vous demandent d'être courtois : environ une requête par seconde par hôte. Pour lire un site entier, récupérez son llms-full.txt au lieu de l'explorer page par page. Après un 429, attendez la durée indiquée par Retry-After. Les fichiers de découverte changent au plus environ une fois par minute, alors les interroger plus souvent renvoie le même contenu.

Consultez la recherche d'inscriptions et le serveur MCP pour le portrait complet.

Gérer une limite dans votre code

ask-with-wait.mjs
async function ask(query) {
  const response = await fetch(`https://matchai.co/ask?query=${encodeURIComponent(query)}`);

  if (response.status === 429 || response.status === 503) {
    const wait = Number(response.headers.get('Retry-After') ?? 60);
    await new Promise((resolve) => setTimeout(resolve, wait * 1000));
    return ask(query); // Try once more after the wait.
  }

  return response.json();
}

Dans du vrai code, ajoutez un compteur, pour qu'une requête qui échoue sans cesse finisse par abandonner.

Dans l'API Matchai

Bientôt disponible

L'API Matchai limite les requêtes par connexion : un compte Matchai connecté à une application. Les chiffres ne sont pas encore publiés ici. Ne les codez pas en dur : l'API vous indique où vous en êtes dans chaque réponse.

En-têtes de limite de débit

Chaque réponse porte trois en-têtes :

En-têteSignification
RateLimit-LimitLes requêtes permises dans la fenêtre actuelle pour cette connexion
RateLimit-RemainingLes requêtes qui restent dans la fenêtre actuelle
RateLimit-ResetLes secondes avant la réinitialisation de la fenêtre
Response headers
RateLimit-Limit: 120
RateLimit-Remaining: 117
RateLimit-Reset: 41
Matchai-Request-Id: req_7Hq2LmZ9xV4c

Les nombres ci-dessus sont un exemple. Ce n'est pas la vraie limite.

Quand vous dépassez la limite

Une requête au-delà de la limite est refusée avec 429 et ne fait rien. La réponse porte Retry-After, le nombre de secondes à attendre :

Response (429)
{
  "error": {
    "type": "rate_limit_error",
    "code": "rate_limited",
    "message": "Too many requests. Try again in 20 seconds.",
    "doc_url": "https://matchai.co/docs/developers/errors#rate_limited",
    "request_id": "req_7Hq2LmZ9xV4c"
  }
}

Un 429 peut être réessayé sans risque. Attendez la durée de Retry-After, puis renvoyez la requête avec le même Idempotency-Key, pour que rien ne se fasse deux fois. La section Réessayer sans risque donne un exemple complet.

Qui partage une limite

  • Toutes les clés d'un même compte partagent une seule limite, parce qu'elles appartiennent à une seule connexion. Une deuxième clé ne donne pas plus de marge. Consultez Clés d'API.
  • Deux professionnels connectés à la même application ont des limites distinctes. La matinée chargée d'un courtier ne ralentit pas la connexion d'un autre courtier.
  • Les opérations publiques fonctionnent sans identifiant de connexion, avec des limites plus basses. Consulter le profil ou les inscriptions publiés d'un professionnel ne demande aucune clé. Ces requêtes sont comptées par adresse IP, et envoyer une clé ou un jeton relève la limite. Elles sont marquées Free (gratuit) dans la référence de l'API.

Les limites de débit ne sont pas des limites d'énergie

Une action qui utilise de l'Énergie Matchai peut être refusée pour deux autres raisons, et aucune n'est un 429 :

  • Le compte n'a plus d'énergie : 402 avec le code insufficient_energy.
  • Le titulaire du compte a fixé une limite d'énergie pour votre connexion, et vous l'avez atteinte : 402 avec le code energy_limit_reached.

Attendre ne règle ni l'un ni l'autre. Consultez Erreurs.

Rester bien sous la limite

  • Lisez les en-têtes. Ralentissez quand RateLimit-Remaining est bas, et faites une pause jusqu'à RateLimit-Reset quand il atteint zéro.
  • Écoutez au lieu d'interroger. Les webhooks vous avisent quand un prospect arrive ou qu'une inscription change, sans aucune requête.
  • Synchronisez ce qui a changé. Utilisez updated_since sur les points de terminaison de liste, et demandez des pages de limit=100, la plus grande taille de page.
  • Étalez le travail en lot. Importer une centaine de contacts se fait en file d'attente, pas en rafale.
  • Ne répétez que ce qui a échoué. Les clés d'idempotence vous permettent de réessayer une seule requête sans risque.
paced-fetch.mjs
export async function pacedFetch(url, init) {
  const response = await fetch(url, init);

  const remaining = Number(response.headers.get('RateLimit-Remaining'));
  const reset = Number(response.headers.get('RateLimit-Reset'));

  // Nearly out of requests: wait for the window to reset before the next call.
  if (remaining <= 1 && reset > 0) {
    await new Promise((resolve) => setTimeout(resolve, reset * 1000));
  }

  return response;
}

Sur cette page