Skip to content

Usage Endpoint

The usage endpoint returns real-time information about your API consumption, remaining quota, rate limits, and plan details.

GET /api/usage
HeaderRequiredDescription
X-API-KeyYesYour API key
Terminal window
curl -X GET https://api.spamidate.com/api/usage \
-H "X-API-Key: spm_live_..."

{
"period": {
"start": "2024-01-01T00:00:00.000Z",
"end": "2024-01-31T23:59:59.999Z",
"daysRemaining": 16
},
"quota": {
"limit": 10000,
"used": 4523,
"remaining": 5477,
"percentage": 45.23,
"inGracePeriod": false,
"hardLimit": 12000
},
"rateLimit": {
"limitPerMinute": 100,
"limitPerDay": 10000,
"usedThisMinute": 12,
"usedToday": 1547,
"remainingThisMinute": 88,
"remainingToday": 8453,
"minuteResetsAt": "2024-01-15T10:31:00.000Z",
"dayResetsAt": "2024-01-16T00:00:00.000Z"
},
"recentErrors": {
"unauthorized": 0,
"rateLimited": 2,
"badRequest": 5,
"serverError": 0,
"lastErrorAt": "2024-01-15T09:45:00.000Z"
},
"plan": {
"tier": "growth",
"name": "Growth",
"features": [
"syntax",
"domain",
"mxRecords",
"disposable",
"roleBased",
"catchAll",
"typoSuggestion",
"freeEmail",
"corporateEmail",
"mailboxProvider"
]
}
}

FieldTypeDescription
startstringBilling period start (ISO 8601)
endstringBilling period end (ISO 8601)
daysRemainingnumberDays until quota resets
FieldTypeDescription
limitnumberMonthly quota limit
usednumberValidations used this period
remainingnumberValidations remaining
percentagenumberPercentage of quota used
inGracePeriodbooleanWhether in 100-120% grace period
hardLimitnumberAbsolute limit (120% for Growth+)
FieldTypeDescription
limitPerMinutenumberMax requests per minute
limitPerDaynumberMax requests per day
usedThisMinutenumberRequests made this minute
usedTodaynumberRequests made today
remainingThisMinutenumberRequests left this minute
remainingTodaynumberRequests left today
minuteResetsAtstringWhen minute limit resets
dayResetsAtstringWhen daily limit resets
FieldTypeDescription
unauthorizednumber401 errors (last 24h)
rateLimitednumber429 errors (last 24h)
badRequestnumber400 errors (last 24h)
serverErrornumber5xx errors (last 24h)
lastErrorAtstringMost recent error timestamp
FieldTypeDescription
tierstringPlan tier identifier
namestringHuman-readable plan name
featuresstring[]Available validation checks

const usage = await client.getUsage();
if (usage.quota.percentage > 80) {
console.warn(`Warning: ${usage.quota.percentage}% of quota used`);
}
if (usage.quota.inGracePeriod) {
console.error('In grace period - upgrade plan to avoid service interruption');
}
if (usage.quota.remaining < 100) {
console.error(`Only ${usage.quota.remaining} validations remaining`);
}
const usage = await client.getUsage();
// Check if we're approaching per-minute limit
if (usage.rateLimit.remainingThisMinute < 10) {
const waitMs = new Date(usage.rateLimit.minuteResetsAt).getTime() - Date.now();
console.log(`Rate limited - wait ${Math.ceil(waitMs / 1000)}s`);
}
// Check daily limit
if (usage.rateLimit.remainingToday < 100) {
console.warn('Approaching daily limit');
}
function displayUsage(usage: UsageResponse) {
return {
quota: `${usage.quota.used.toLocaleString()} / ${usage.quota.limit.toLocaleString()}`,
percentage: `${usage.quota.percentage.toFixed(1)}%`,
remaining: usage.quota.remaining.toLocaleString(),
daysLeft: usage.period.daysRemaining,
plan: usage.plan.name,
};
}
const usage = await client.getUsage();
if (usage.recentErrors.rateLimited > 10) {
console.warn('High rate limit errors - consider batching requests');
}
if (usage.recentErrors.badRequest > 0) {
console.warn('Bad request errors - check input validation');
}
if (usage.recentErrors.serverError > 0) {
console.error('Server errors detected - contact support if persistent');
}

async function checkAndNotify() {
const usage = await client.getUsage();
if (usage.quota.percentage >= 80) {
await fetch(process.env.SLACK_WEBHOOK, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
text: `Spamidate quota alert: ${usage.quota.percentage}% used (${usage.quota.remaining} remaining)`,
}),
});
}
}
// Run every hour
setInterval(checkAndNotify, 60 * 60 * 1000);
check-quota.sh
#!/bin/bash
USAGE=$(curl -s https://api.spamidate.com/api/usage \
-H "X-API-Key: $SPAMIDATE_API_KEY")
PERCENTAGE=$(echo $USAGE | jq '.quota.percentage')
if (( $(echo "$PERCENTAGE > 80" | bc -l) )); then
echo "Warning: Spamidate quota at $PERCENTAGE%"
# Send alert
fi

For Growth tier and above:

Quota UsageStatus
0-80%Normal
80-100%Warning headers sent
100-120%Grace period (requests still work)
>120%Hard stop until next period
const usage = await client.getUsage();
if (usage.quota.inGracePeriod) {
// Using grace period buffer
const graceUsed = usage.quota.used - usage.quota.limit;
const graceRemaining = usage.quota.hardLimit - usage.quota.used;
console.warn(`Grace period: ${graceUsed} used, ${graceRemaining} remaining`);
}