Skip to content
Phylax
Reference

Rate Limits

Understand limits, protect reliability, and plan your integrations.

Phylax API rate limits ensure fair usage and protect the reliability of the platform. Limits are applied per API token and vary by plan and endpoint.

  1. Overview

    Rate limits are applied over different windows, to balance sustained usage against short bursts.

    Per minute Limits the average number of requests you can make each minute. Encourages consistent, steady usage.
    Burst Allows a short burst of requests above the per-minute limit, for brief spikes.
    Monthly quota Caps total requests per calendar month. Resets on the 1st of each month, UTC.

    All three apply at once. A request is rejected by whichever is exhausted first, so staying under the per-minute limit does not help if the monthly quota is spent.

  2. Plan limits

    Limits are attached to the subscription behind your API token, not to the token itself. Minting a second key does not raise them.

    PlanPer minuteBurstAllowance
    Anonymous3060No API access
    Builder300600Daily
    Marketplace9001,800Unlimited, priority queue
    Enterprise3,0006,000Custom volume

    Anonymous is the only free plan and it has no API access at all. Its limit covers the public catalog, search and public scores on the web, counted per network address rather than per account. Every API and SDK call requires Builder or above.

    Under load, Marketplace and Enterprise requests are served ahead of others on a priority queue, so a busy period degrades the cheapest traffic first.

    Need higher limits? Contact us to discuss enterprise options.

  3. Response headers

    Every response carries the current state of your limit, so you never need to guess or discover it by being rejected.

    HeaderTypeDescription
    X-RateLimit-LimitintegerMaximum requests allowed in the current window.
    X-RateLimit-RemainingintegerRequests remaining in the current window.
    X-RateLimit-ResetintegerUnix time (UTC) at which the current window resets.
    Retry-Afterinteger, secondsPresent on 429 responses. Seconds to wait before retrying.
  4. Retry strategy

    When you receive 429 Too Many Requests, back off and retry. Two rules matter more than the rest: honour Retry-After when it is present, and add jitter when it is not.

    const MAX_ATTEMPTS = 5;
    async function requestWithRetry(url, options = {}) {
    for (let attempt = 0; attempt < MAX_ATTEMPTS; attempt++) {
    const res = await fetch(url, options);
    if (res.status !== 429) return res;
    // The server knows when it will let you back in. Believe it.
    const retryAfter = Number(res.headers.get('retry-after'));
    // Otherwise: exponential backoff with full jitter, capped at 30s.
    const backoff = Math.min(2 ** attempt, 30);
    const delay = Number.isFinite(retryAfter) && retryAfter > 0
    ? retryAfter
    : Math.random() * backoff;
    await new Promise((r) => setTimeout(r, delay * 1000));
    }
    throw new Error('Rate limited after ${MAX_ATTEMPTS} attempts');
    }
  5. Best practices

    Cache results Cache responses for idempotent lookups. A verdict for a pinned version does not change between two calls a minute apart.
    Batch lookups Use bulk endpoints or batch requests instead of one call per dependency.
    Respect Retry-After Honour the header rather than guessing, to avoid prolonged throttling.
    Use scoped tokens Keep a token per service. Limits are per token, so one noisy job cannot starve the rest.

Read the headers instead of counting

Track X-RateLimit-Remaining and slow down as it approaches zero, rather than maintaining your own counter. Your counter cannot see the other processes sharing that token, and it drifts the moment a retry, a redirect or a background job makes a request you did not account for.

See Error codes for every response status and whether it is retryable, or API reference for per-endpoint limits.

Did this page help you?