Skip to content

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.

HeaderMeaning
X-RateLimit-LimitRequests per second currently available to you
X-RateLimit-RemainingHow many are left in the current second
X-RateLimit-ResetSeconds until the counter resets
Retry-AfterSent 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"
}
  1. Honour Retry-After — do not retry immediately. Hammering the API keeps you rejected longer.
  2. Use exponential backoff if you keep hitting 429.
  3. Queue on your side. When slips arrive in bursts, feed them through at your TPS instead of letting them be rejected.
  4. Watch X-RateLimit-Remaining and 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 limitsRequests per secondTotal slips your plan allows
How to resolveWait and retryTop up, or wait for the reset
Clears on its ownYes, within secondsNo — not until you top up or it resets

Bank Slip Verification API for Thai Banking