Rate Limits & Idempotency
To ensure consistent low-latency delivery, equitable resource sharing, and protection against accidental loops or DDoS attacks, Softymize enforces sliding-window rate limits across all API endpoints. In addition, our 24-hour distributed Idempotency caching guarantees that duplicated requests produce zero duplicate messages or charges.
Tiered Plan Rate Limits
Rate limits are evaluated per workspace across sliding 60-second windows based on your active billing plan:
| Plan Tier | Requests per Minute | Burst Allowance | Behavior on Limit Exceeded |
|---|---|---|---|
| Starter Plan | 60 req / min | Up to 15 req/sec | HTTP 429 Too Many Requests |
| Pro Plan | 300 req / min | Up to 50 req/sec | HTTP 429 Too Many Requests |
| Business Plan | 1,000 req / min | Up to 150 req/sec | HTTP 429 Too Many Requests |
| Enterprise Plan | 5,000+ req / min | Custom SLA (500+ req/sec) | Dedicated Redis Isolated Queue |
Standard Rate Limit Response Headers
Every HTTP response from the Softymize gateway includes standard RFC headers reflecting your current quota usage in real time:
| Header | Example Value | Description |
|---|---|---|
| X-RateLimit-Limit | 300 | The maximum number of requests allowed within your current 60-second window. |
| X-RateLimit-Remaining | 284 | The number of remaining requests available before hitting the rate limit. |
| X-RateLimit-Reset | 1729189260 | Unix timestamp indicating when the current sliding window will reset. |
| Retry-After | 14 | Returned on HTTP 429 responses. Number of seconds your client must sleep before retrying. |
HTTP/1.1 200 OKContent-Type: application/json; charset=utf-8X-RateLimit-Limit: 300X-RateLimit-Remaining: 284X-RateLimit-Reset: 1729189260X-Request-Id: req_9f8a3c4b12d34e5fHTTP 429 Too Many Requests Envelope
If your client exceeds your plan's request limit, the gateway rejects the request with HTTP status 429 Too Many Requests and provides the exact wait duration:
{ "success": false, "error": { "code": "RATE_LIMIT_EXCEEDED", "message": "Too many requests. You have reached your rate limit of 300 requests per minute.", "retry_after": 14, "limit": 300, "doc_url": "https://docs.softymize.com/api-docs/rate-limits" }, "meta": { "request_id": "req_8a1b2c3d4e5f6g7h", "timestamp": "2026-10-17T18:55:00Z" }}24-Hour Idempotency Key Deduplication
Network glitches, mobile drops, or client timeouts can trigger automated retries. Without idempotency, a customer could receive duplicate WhatsApp order confirmations or multiple OTP messages. Softymize supports the X-Idempotency-Key header to guarantee safe retries.
Include an X-Idempotency-Key header with a unique UUID or transaction slug on sensitive POST requests.
Softymize atomically locks and stores the initial response payload and status in our Redis cluster with a 24-hour TTL.
Any retry using the same idempotency key returns the original cached response immediately without re-dispatching messages.
curl -X POST https://api.softymize.com/api/v1/whatsapp/send \ -H "X-Softymize-API-Key: sft_live_9b8a7c6d5e4f3a2b1" \ -H "X-Idempotency-Key: ord_tx_88219_checkout" \ -H "Content-Type: application/json" \ -d '{ "to": "+919876543210", "template_name": "order_confirmation_v2", "variables": { "customer_name": "Rahul Sharma", "order_id": "ORD-88219", "amount": "₹2,499.00" } }'Channel-Specific Quotas & Meta / AWS Limits
In addition to Softymize workspace API limits, each outbound channel has upstream platform limits:
- Tier 1: 1,000 unique customers / 24h
- Tier 2: 10,000 unique customers / 24h
- Tier 3: 100,000 unique customers / 24h
- Tier 4: Unlimited customer messaging
- Burst Rate: Up to 100 emails / sec
- Daily Quota: Up to 500,000 emails / day
- Max Payload: 25MB (including attachments)
- Zero-bounce: Real-time suppression
- Throughput: 10,000+ events / sec
- Processing: Asynchronous Redis workers
- Checkout Impact: < 5ms page latency
- Storage: 90 days event log history
Recommended Retry Logic: Exponential Backoff with Jitter
When handling high-volume surges (such as Flash Sales or Festive Broadcasts), always implement an exponential backoff loop with randomized jitter to prevent the "thundering herd" problem:
const axios = require('axios');async function sendWithExponentialBackoff(endpoint, data, maxRetries = 3) { let attempt = 0; while (attempt < maxRetries) { try { return await axios.post(`https://api.softymize.com/api/v1${endpoint}`, data, { headers: { 'X-Softymize-API-Key': process.env.SOFTYMIZE_API_KEY, 'X-Idempotency-Key': data.idempotency_key || undefined, 'Content-Type': 'application/json' } }); } catch (error) { if (error.response && error.response.status === 429) { attempt++; // Read Retry-After header or fallback to exponential backoff const retryAfterSeconds = parseInt(error.response.headers['retry-after'], 10) || Math.pow(2, attempt); const delayMs = (retryAfterSeconds * 1000) + Math.random() * 500; // Adding jitter console.warn(`Rate limited. Retrying attempt ${attempt}/${maxRetries} after ${Math.round(delayMs)}ms...`); await new Promise((resolve) => setTimeout(resolve, delayMs)); } else { throw error; } } } throw new Error('Maximum retry limit exceeded for rate-limited request.');}If your store is expecting a high-traffic spike (such as Black Friday, Big Billion Days, or a celebrity campaign), contact your Softymize Technical Account Manager or write to [email protected] at least 48 hours in advance for temporary or permanent dedicated queue provisioning.