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