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:

EndpointAuthenticatedUnauthenticated

/v1/guess-email10,000/min3/min
/v1/verify-email100/sec (paid)10/sec (free)
/v1/generate-summary10 per 2 secondsN/A

Note: 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:

javascript
// 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:

javascript
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:

javascript
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:

javascript
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

json
{
"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.