Rate Limits
API rate limiting information
SuperSend API has generous rate limits designed for high-volume enterprise use cases.
Current Rate Limits
V1 API
The V1 API has rate limiting on specific endpoints only:
/v1/guess-email/v1/verify-email/v1/generate-summaryNote: Most V1 endpoints (contact CRUD, campaigns, teams, etc.) do not have rate limiting applied.
V2 API
The V2 API currently does not enforce strict rate limits for authenticated requests. However, we recommend implementing reasonable request patterns to ensure optimal performance.
Best Practices
Even without strict rate limits, following these practices ensures reliable integration:
1. Use Bulk Endpoints
Instead of creating contacts one by one, use bulk creation:
// Less efficient - multiple requests
for (const contact of contacts) {
await createContact(contact)
}// More efficient - single request
await fetch('https://api.supersend.io/v1/bulk-contacts', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
contacts: contacts,
TeamId: 'your-team-id',
CampaignId: 'your-campaign-id'
})
})
2. Implement Exponential Backoff
For any errors, implement exponential backoff:
async function apiRequestWithRetry(url, options, maxRetries = 3) {
for (let attempt = 0; attempt < maxRetries; attempt++) {
try {
const response = await fetch(url, options)
if (response.ok) return response
// For server errors, retry with backoff
if (response.status >= 500) {
const delay = Math.min(1000 * Math.pow(2, attempt), 30000)
await new Promise(r => setTimeout(r, delay))
continue
}
return response // Client errors shouldn't be retried
} catch (err) {
if (attempt === maxRetries - 1) throw err
const delay = Math.min(1000 * Math.pow(2, attempt), 30000)
await new Promise(r => setTimeout(r, delay))
}
}
}3. Cache Responses
Don't fetch the same data repeatedly:
const cache = new Map()async function getCampaign(id) {
if (cache.has(id)) {
return cache.get(id)
}
const response = await fetch(https://api.supersend.io/v2/campaigns/${id}, {
headers: { 'Authorization': 'Bearer YOUR_API_KEY' }
})
const campaign = await response.json()
cache.set(id, campaign.data)
// Clear cache after 5 minutes
setTimeout(() => cache.delete(id), 5 60 1000)
return campaign.data
}
4. Use Pagination Efficiently
When fetching large datasets, use appropriate page sizes:
async function getAllContacts(teamId, campaignId) {
const allContacts = []
let offset = 0
const limit = 100
while (true) {
const response = await fetch(
https://api.supersend.io/v2/contacts?TeamId=${teamId}&CampaignId=${campaignId}&limit=${limit}&offset=${offset},
{ headers: { 'Authorization': 'Bearer YOUR_API_KEY' } }
)
const data = await response.json()
allContacts.push(...data.data)
if (!data.pagination.has_more) break
offset += limit
}
return allContacts
}Error Handling
If you encounter errors, they are not rate limit errors but other API errors. See Error Handling for details on error codes and handling.
V2 Error Response Format
{
"error": {
"type": "api_error",
"code": "internal_error",
"message": "An internal error occurred",
"doc_url": "https://docs.supersend.io/docs/errors#internal_error"
},
"request_id": "req_a1b2c3d4e5f6789012345678"
}Need Higher Throughput?
For enterprise customers with specific throughput requirements, contact support@supersend.io to discuss your use case.