Rate Limiting

Rate limits control how many requests your company can make to the Listen API in a period of time. When a limit is exceeded, the API responds with 429 Too Many Requests until the window resets.

How rate limits work

ConceptDescription
BucketEvery endpoint belongs to a bucket. Endpoints in the same bucket share one limit.
Company ScopeRequests made with all API keys of your company count together.
Access tierYour API access tier, Free or Premium, sets the limits.
15-minute windowApplies to every bucket. Resets every quarter of an hour.
Monthly windowA calendar month (UTC), reset at 00:00 UTC on the 1st. Applies to search and lookup buckets on Free, and to project changes on Premium.

Requests rejected with 429 do not count towards either window.

Checking your limits

Every response includes headers with the usage of the endpoint's bucket

x-rate-limit-limit: 100
x-rate-limit-remaining: 42
x-rate-limit-reset: 1793718000
HeaderDescription
x-rate-limit-limitMaximum number of requests in the current time-window
x-rate-limit-remainingRequests remaining in the current 15-minute window
x-rate-limit-resetUnix timestamp (seconds) when the 15-minute window resets

A request is rejected when either window has no requests remaining, so the number of requests you can still make is the lower of the two remaining values.

Rate limit tables

Below you'll find rate-limits for each API Tier

Buckets

BucketEndpoints
projects-readGET /v2/projects
GET /v2/projects/{projectId}
projects-writePOST /v2/projects
PUT /v2/projects/{projectId}
projects-deleteDELETE /v2/projects/{projectId}
recent-searchPOST /v2/projects/{projectId}/mentions/recent/search
POST /v2/discussions/{discussionId}/mentions/recent/search
historical-searchPOST /v2/projects/{projectId}/mentions/search
POST /v2/discussions/{discussionId}/mentions/search
mention-lookupGET /v2/mentions/{mentionId}
mention-parent-searchGET /v2/mentions/{mentionId}/parent
mention-writePOST /v2/mentions/{mentionId}/tags
DELETE /v2/mentions/{mentionId}/tags
recent-streamPOST /v2/projects/{projectId}/mentions/recent/search/stream
POST /v2/projects/{projectId}/mentions/recent/search/stream/live
POST /v2/discussions/{discussionId}/mentions/recent/search/stream
POST /v2/discussions/{discussionId}/mentions/recent/search/stream/live
historical-streamPOST /v2/projects/{projectId}/mentions/search/stream
POST /v2/discussions/{discussionId}/mentions/search/stream
engagement-streamPOST /v2/mentions/engagement/updates/stream/live

Premium tier

BucketPer 15 minutesPer month
projects-read1,000—
projects-write258 × your projects limit
projects-delete1,000—
recent-search100—
historical-search20—
mention-lookup500—
mention-parent-search100—
mention-write250—
recent-stream500—
historical-stream50—
engagement-stream500—

— means no monthly limit.

Monthly limit for projects-write bucket depends on number of projects

Creating and amending projects through API has additional monthly limit that depends on the projects limit you have on your account. Its equal to 8 × the projects limit of your package.

EXAMPLE

  • With a limit of 10 projects, you can create or update projects 80 times a month through API
  • This means you can replace every project 8 times a month using API

Free tier

BucketPer 15 minutesPer month
projects-read1,000—
recent-search100500
mention-lookup500500
mention-parent-search100500

— means no monthly limit. Endpoints of the other buckets are not available on the Free tier.

Concurrency limit (Streams)

Streaming endpoints are subject to additional concurrency limitations.

  • 2 concurrent mention streams (recent, historical and live streams share them)
  • 1 concurrent engagement stream

Handling rate limits

When a limit is exceeded, the API responds with 429 Too Many Requests:

{"message":"Rate limit of requests for this endpoint has been reached. Maximum number of requests for this endpoint is 500 per calendar month. Limits will reset at 2026-12-01T00:00:00.000Z."}

The message says which window was used up: per 15 minutes or per calendar month.

Recovery strategy

  1. Read the reset header of the window that has no requests remaining: x-rate-limit-reset for the 15-minute window, x-rate-limit-monthly-reset for the monthly window.
  2. Wait until that time before retrying.
  3. Retry the request.
import time
import requests

def make_request_with_retry(url, headers, payload):
    response = requests.post(url, headers=headers, json=payload)

    if response.status_code == 429:
        monthly_exhausted = response.headers.get("x-rate-limit-monthly-remaining") == "0"
        reset_header = "x-rate-limit-monthly-reset" if monthly_exhausted else "x-rate-limit-reset"
        reset_time = int(response.headers.get(reset_header, 0))
        time.sleep(max(reset_time - time.time(), 60))
        return make_request_with_retry(url, headers, payload)

    return response

Best practices

  • Use export streams for bulk extraction. A paginated search returns up to 50 mentions per request; an export stream delivers all matching mentions over one connection.
  • Use live streams for new mentions instead of polling recent search.
  • Monitor the headers. Track x-rate-limit-remaining and, where present, x-rate-limit-monthly-remaining to slow down before reaching a limit.
  • Spread requests across the window instead of sending them in bursts.

Rate limits and the mentions cap

Rate limits and the mentions cap are separate:

ConceptWhat it counts
Rate limitsRequests per bucket, in the 15-minute and monthly windows