# Rate limits

Postman APIs enforce rate limits to ensure fair usage and message delivery standards for WoG. Rate limits can be found in the Settings tab of your campaign.

Rate limits are applied globally - if your rate limit is 10 TPS, this includes all transactions (sending a message, querying for a message status, etc.).

Postman will **drop the request** and return with a `HTTP 429 Too Many Requests` status code to indicate that you have hit the rate limit. Your campaign's TPS will not be increased just because you hit a rate limit.

<mark style="color:red;">**Agencies are responsible for ensuring that retry mechanisms are in place (e.g., implementing exponential backoff).**</mark>

***

**Default Rate Limit**

The default rate limit is **10 TPS (transactions per second) per campaign ID**. This is defined as the number of API calls per second, not the number of messages sent per second.

***

**Shared Across All APIs**

The rate limit is shared across all API endpoints for a campaign. For example, if within your campaign you call the following simultaneously:

* Single Send at 6 TPS
* Retrieve Message at 2 TPS
* Batch Send at 4 TPS

This adds up to 12 TPS, which exceeds the 10 TPS limit. You will receive a `429` error on the requests that exceed the limit.

***

**Single Send vs Batch Send TPS**

The TPS counts **API calls**, not messages. The number of messages sent per API call differs between single send and batch send:

| Method      | 1 TPS equals                                                 |
| ----------- | ------------------------------------------------------------ |
| Single Send | 1 API call = 1 message                                       |
| Batch Send  | 1 API call = multiple messages (one per row in the CSV file) |

For example, if you are using batch send with a CSV file containing 20 rows, 1 API call sends 20 messages while only counting as 1 TPS.

***

**Message Priority**

The TPS limit applies only to messages entering the Postman system, not messages sent to end recipients. Message delivery speeds may be slower than the TPS rate during peak periods (8:00 am to 6:00 pm daily).

Messages are prioritised in the following order:

1. Time-sensitive/OTP messages using Single Send
   * If you are sending time-sensitive, life-or-death SMSes like lightning alerts, use the Single Send API.
2. All messages using Batch Send

***

**Requesting a Higher TPS**

You must provide evidence:

* Internal logs from your actual historical systems showing that you have previously hit that higher TPS
* Logs from testing on Postman are **not** considered proof

***

**Large Campaign Requirements**

If your campaign meets any of the following criteria, you must submit the [large campaign form](https://form.gov.sg/67a17d1adcc3e09f3a56003a) before sending:

* **Time-sensitive campaigns:** Making more than 50 API requests per second, or more than 100 message segments per second
* **Large campaigns:** Above 200,000 recipients

***

**5xx Server Errors and Queuing**

For 5xx server errors, requests are **not** queued on Postman's side. You will need to retry these requests yourself.

***

**Error Response**

When you hit the rate limit, you will receive:

```
HTTP 429 Too Many Requests
```

```json
{
  "error": {
    "code": "too_many_requests",
    "message": "Too many requests",
    "type": "domain_error",
    "id": "<TRACE_ID>"
  }
}
```

Implement exponential backoff to handle rate limit errors gracefully. Do not immediately retry at the same rate, as this will continue to trigger the rate limit.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://postman-v2.guides.gov.sg/technical-users-api/api-reference/rate-limits.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
