Rate Limit
The EasySlip API limits how many requests you can make per second (TPS — Transactions Per Second) so that slip verification stays responsive for everyone.
TPS per plan
Your available TPS depends on your plan. If you are unsure what yours is, or you need more than your plan allows, contact support to have it raised for your account.
Bank slip verification and TrueMoney Wallet verification are limited separately — calls to one do not consume the other's budget.
Response headers
Every request that passes through the rate limiter comes back with these headers.
| Header | Meaning |
|---|---|
X-RateLimit-Limit | Requests per second currently available to you |
X-RateLimit-Remaining | How many are left in the current second |
X-RateLimit-Reset | Seconds until the counter resets |
Retry-After | Sent only when you are rejected (429) — how many seconds to wait |
TIP
X-RateLimit-Limit can change with system load. Read it from the header on every response rather than hard-coding a number in your client.
When you are limited
You get HTTP status 429 together with a Retry-After header.
v2
json
{
"success": false,
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Rate limit exceeded"
}
}v1
json
{
"status": 429,
"message": "rate_limit_exceeded"
}Recommended handling
- Honour
Retry-After— do not retry immediately. Hammering the API keeps you rejected longer. - Use exponential backoff if you keep hitting 429.
- Queue on your side. When slips arrive in bursts, feed them through at your TPS instead of letting them be rejected.
- Watch
X-RateLimit-Remainingand slow yourself down before you hit the ceiling.
JavaScript
javascript
async function verifyWithRetry(payload, maxRetries = 3) {
for (let attempt = 0; attempt <= maxRetries; attempt++) {
const res = await fetch('https://api.easyslip.com/v2/verify/bank', {
method: 'POST',
headers: {
Authorization: `Bearer ${API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({ payload }),
})
if (res.status !== 429) return res.json()
// Wait as long as the server asked, then back off exponentially.
const retryAfter = Number(res.headers.get('Retry-After') ?? 1)
const waitSec = retryAfter * 2 ** attempt
await new Promise(r => setTimeout(r, waitSec * 1000))
}
throw new Error('rate limit exceeded after retries')
}Python
python
import time
import requests
def verify_with_retry(payload, max_retries=3):
for attempt in range(max_retries + 1):
res = requests.post(
'https://api.easyslip.com/v2/verify/bank',
headers={'Authorization': f'Bearer {API_KEY}'},
json={'payload': payload},
)
if res.status_code != 429:
return res.json()
retry_after = int(res.headers.get('Retry-After', 1))
time.sleep(retry_after * (2 ** attempt))
raise Exception('rate limit exceeded after retries')How this differs from quota_exceeded
| Rate limit (429) | Quota exhausted (quota_exceeded) | |
|---|---|---|
| What it limits | Requests per second | Total slips your plan allows |
| How to resolve | Wait and retry | Top up, or wait for the reset |
| Clears on its own | Yes, within seconds | No — not until you top up or it resets |