Implement Clay rate limiting, backoff, and idempotency patterns.
Use when handling rate limit errors, implementing retry logic,
or optimizing API request throughput for Clay.
Trigger with phrases like "clay rate limit", "clay throttling",
"clay 429", "clay retry", "clay backoff".
Clay enforces rate limits at the plan level, webhook level, and enrichment provider level. Understanding these limits prevents data loss, credit waste, and integration failures.
Prerequisites
Clay account with known plan tier
Webhook URL(s) for your tables
Understanding of your data volume requirements
Instructions
Step 1: Understand Clay Rate Limit Tiers
Plan
Records/Hour
Webhook Limit
HTTP API Columns
Enterprise API
Free
Limited
50K lifetime per webhook
Not available
Not available
Starter
Standard
50K lifetime per webhook
Not available
Not available
Explorer
400/hour
50K lifetime per webhook
Not available
Not available
Pro
Unlimited
50K lifetime per webhook
Available
Not available
Enterprise
Unlimited
50K lifetime per webhook
Available
Available
Key insight: The 50K webhook submission limit is per-webhook, not per-table. Once exhausted, create a new webhook on the same table.
// src/clay/webhook-manager.ts
interface WebhookState {
url: string;
submissionCount: number;
createdAt: Date;
}
class WebhookManager {
private webhooks: Map<string, WebhookState> = new Map();
private readonly LIMIT = 50_000;
private readonly WARN_THRESHOLD = 45_000;
registerWebhook(tableId: string, url: string) {
this.webhooks.set(tableId, { url, submissionCount: 0, createdAt: new Date() });
}
async getWebhookUrl(tableId: string): Promise<string> {
const state = this.webhooks.get(tableId);
if (!state) throw new Error(`No webhook registered for table ${tableId}`);
if (state.submissionCount >= this.LIMIT) {
throw new Error(
`Webhook for table ${tableId} exhausted (${this.LIMIT} submissions). ` +
`Create a new webhook in Clay UI: Table > + Add > Webhooks > Monitor webhook`
);
}
if (state.submissionCount >= this.WARN_THRESHOLD) {
console.warn(
`Webhook for ${tableId} at ${state.submissionCount}/${this.LIMIT} submissions. ` +
`Plan to create a replacement soon.`
);
}
return state.url;
}
recordSubmission(tableId: string) {
const state = this.webhooks.get(tableId);
if (state) state.submissionCount++;
}
}
Step 5: Enrichment Provider Rate Limits
Enrichment providers within Clay have their own limits. When using Clay's managed accounts, Clay handles throttling internally. When using your own API keys, you inherit the provider's rate limits: