Manage and optimize Lindy AI rate limits. Use when hitting rate limits, optimizing API usage, or implementing rate limit handling. Trigger with phrases like "lindy rate limit", "lindy quota", "lindy...
Build application-side controls for Lindy webhook-trigger traffic and workspace usage. Lindy plan terms, prices, credit rules, and service limits can vary or change; obtain them from the current workspace and contract instead of copying fixed commercial numbers into code.
Use Read to inspect the caller and Write or Edit to implement its policy. This skill does not assume an undocumented Lindy REST API or SDK.
Record the evidence source and review date for every Lindy-provided credit or service constraint. Then choose application-owned controls independently:
These are local risk controls, not claims about Lindy's service limits. Review them from observed traffic, task outcomes, and the organization's budget.
Parse the configured URL; require protocol https:, hostname exactly
public.lindy.ai, no username or password, and the expected webhook path. Reject
an empty trigger secret. Never send the trigger secret to a callback receiver or
reuse a callback secret for the outbound trigger.
const triggerUrl = new URL(process.env.LINDY_TRIGGER_URL ?? '');
const triggerSecret = process.env.LINDY_TRIGGER_SECRET ?? '';
if (
triggerUrl.protocol !== 'https:' ||
triggerUrl.hostname !== 'public.lindy.ai' ||
triggerUrl.username !== '' ||
triggerUrl.password !== '' ||
!triggerUrl.pathname.startsWith('/api/v1/webhooks/')
) {
throw new Error('Refusing to send a trigger secret outside the expected Lindy webhook URL');
}
if (triggerSecret.length === 0) throw new Error('LINDY_TRIGGER_SECRET is required');
Allow only documented fields, types, lengths, and enumerated values. Reject
unknown fields and payloads above the locally chosen byte limit. Require a stable
requestId from the business event.
Atomically reserve that ID in a shared idempotency store before enqueueing. Put
the validated event into a durable queue and reuse the same ID for every retry.
Do not assume an Idempotency-Key header is honored by Lindy; the caller owns the
deduplication ledger unless current Lindy documentation explicitly proves otherwise.
Use an atomic token bucket, leaky bucket, or concurrency semaphore in the shared store, keyed by the isolation boundary such as tenant plus agent. A process-local counter protects only one process and is insufficient for horizontally scaled or serverless callers.
The safe path is:
bounded input -> shared idempotency claim -> durable queue
-> shared admission control -> webhook worker -> outcome ledger
When capacity is unavailable, leave the event queued or reject it explicitly. Do not busy-loop or allow every instance to retry independently.
Retry-After only up to the local maximum delay.The detailed reference includes a secure TypeScript worker and shared-store contract: implementation details.
Track admitted, queued, shed, retried, dead-lettered, and corroborated events; queue age; response status classes; and workspace usage from available Lindy views. Alert on a sustained change from the observed baseline. Revisit the local policy whenever the plan, workspace configuration, workload, or deployment shape changes.
Produce a rate-control design containing:
evidence:
lindy_constraints: workspace billing and task views reviewed on YYYY-MM-DD
local_policy:
payload_schema: trigger-event-v2
payload_bytes: organization-approved bound
admission_key: tenant_id + agent_id
idempotency_key: source_event_id
retryable_statuses: [408, 429, selected_5xx]
terminal_action: dead_letter_and_alert
verification:
task_creation: correlate requestId in the Lindy Tasks view
Submit the same synthetic requestId concurrently through two application
instances. Pass only when one durable job is created, at most one webhook attempt
is admitted for that business event, and the duplicate outcome is observable.
| Condition | Required behavior |
|---|---|
URL is not HTTPS on exact public.lindy.ai host |
Reject before attaching the trigger secret |
| Secret is empty | Fail startup or configuration validation |
| Payload is unknown, malformed, or oversized | Reject before idempotency claim or enqueue |
| Duplicate request ID | Return the recorded disposition; do not repeat the side effect |
| 401/403 or other permanent 4xx | Stop retrying, redact logs, alert the owner |
| 408/429/selected 5xx | Apply bounded backoff with jitter, then dead-letter |
| Shared store unavailable | Fail closed or keep work durable; do not fall back silently to per-process limits |
| 2xx without task corroboration | Mark accepted but unverified and investigate |