Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Configure Lindy AI webhook triggers, callback patterns, and event handling. Use when setting up webhook triggers, implementing callback receivers, or building event-driven Lindy integrations. Trigger with phrases like "lindy webhook", "lindy events", "lindy callback", "lindy webhook trigger".
.claude/skills/jeremylongshore-lindy-webhooks-events/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 42% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 47% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 124% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 29% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 48% | 0% |
Lindy supports webhooks in two directions: Inbound (Webhook Received trigger wakes an agent) and Outbound (HTTP Request action calls your API). This skill covers both patterns, plus the callback pattern for async two-way communication.
lindy-install-auth setupINBOUND (your system triggers Lindy):
[Your App] --POST--> https://public.lindy.ai/api/v1/webhooks/<id>
↓
[Lindy Agent Wakes Up]
↓
[Processes with LLM]
↓
[Executes Actions]
OUTBOUND (Lindy calls your system):
[Lindy Agent] --HTTP Request action--> https://your-api.com/endpoint
↓
[Your Handler]
CALLBACK (two-way async):
[Your App] --POST with callbackUrl--> [Lindy Agent]
↓
[Your App] <--POST to callbackUrl-- [Lindy: Send POST to Callback] https://public.lindy.ai/api/v1/webhooks/<unique-id>
Reference incoming webhook data in any subsequent action field:
| Variable | Description | Example | |----------|-------------|---------| | {{webhook_received.request.body}} | Full JSON payload | {"event": "order.created", ...} | | {{webhook_received.request.body.event}} | Specific field | "order.created" | | {{webhook_received.request.headers}} | All HTTP headers | {"content-type": "application/json"} | | {{webhook_received.request.query}} | URL query params | {"source": "stripe"} |
typescript// webhook-sender.ts — Trigger Lindy agents from your application interface LindyWebhookPayload { event: string; data: Record<string, unknown>; callbackUrl?: string; metadata?: Record<string, unknown>; } async function triggerLindy(payload: LindyWebhookPayload): Promise<void> { const response = await fetch(process.env.LINDY_WEBHOOK_URL!, { method: 'POST', headers: { 'Authorization': `Bearer ${process.env.LINDY_WEBHOOK_SECRET}`, 'Content-Type': 'application/json', }, body: JSON.stringify(payload), }); if (!response.ok) { throw new Error(`Lindy webhook failed: ${response.status}`); } } // Usage examples: await triggerLindy({ event: 'customer.support_request', data: { email: 'user@co.com', subject: 'Billing question', body: '...' }, }); await triggerLindy({ event: 'lead.qualified', data: { name: 'Jane Doe', company: 'Acme', score: 85 }, callbackUrl: 'https://api.yourapp.com/lindy/callback', });
When you include a callbackUrl in your webhook payload, the agent can respond using the Send POST Request to Callback action:
typescript// callback-receiver.ts import express from 'express'; const app = express(); app.use(express.json()); // Receive Lindy agent results app.post('/lindy/callback', (req, res) => { // Verify authenticity const auth = req.headers.authorization; if (auth !== `Bearer ${process.env.LINDY_WEBHOOK_SECRET}`) { return res.status(401).json({ error: 'Unauthorized' }); } // Respond immediately (Lindy expects a quick response) res.json({ received: true }); // Process async handleCallback(req.body); }); async function handleCallback(data: any) { console.log('Lindy callback:', data); // Example: Agent analyzed a support ticket const { classification, sentiment, draft_response, confidence } = data; if (confidence > 0.9) { await sendAutoResponse(draft_response); } else { await escalateToHuman(data); } }
For Lindy agents that call your API as an action step:
https://api.yourapp.com/endpoint Content-Type: application/json Authorization: Bearer {{your_api_key}}
Send the analysis result as JSON with fields: classification, sentiment, summary Based on: {{previous_step.result}}
Prevent unnecessary agent triggers:
Filter: body.event equals "order.created"
AND body.data.amount greater_than 100This ensures the agent only processes high-value orders, saving credits.
Webhook Received → Condition (classify event type)
→ "billing" → Search KB → Draft Reply → Send Email + Slack Alert
→ "technical" → Agent Step (investigate) → Create Ticket → Slack Alert
→ "other" → Forward to team inboxWebhook Received (with callbackUrl) → Process Data → Run Code
→ Send POST Request to Callback (returns results to caller)Webhook Received → Agent Send Message (to Research Lindy)
→ Research Lindy completes → Agent Send Message (to Writer Lindy)
→ Writer Lindy completes → Send Email with final outputLindy provides built-in monitoring triggers:
| Issue | Cause | Solution | |-------|-------|----------| | 401 on webhook send | Wrong or missing Bearer token | Verify secret matches Generate Secret value | | Webhook URL returns 404 | Agent deleted or URL changed | Re-copy URL from agent trigger settings | | Callback not received | callbackUrl unreachable | Ensure HTTPS, public endpoint, no firewall | | Duplicate processing | Webhook retried | Implement idempotency with event IDs | | Payload too large | Body exceeds limit | Reduce payload size, send references not data |
Proceed to lindy-performance-tuning for agent optimization.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-06 | pass→pass | 22,745 | 16,275 | -28% | 1 | 1 | 0% | 2,502 | 3,591 | +44% | 0 | 0 | — |
case-01 | fail→pass | 21,530 | 18,365 | -15% | 1 | 1 | 0% | 3,029 | 4,302 | +42% | 0 | 0 | — |
case-02 | fail→pass | 14,919 | 10,055 | -33% | 1 | 1 | 0% | 1,686 | 2,485 | +47% | 0 | 0 | — |
case-03 | fail→pass | 11,002 | 8,137 | -26% | 1 | 1 | 0% | 1,093 | 2,443 | +124% | 0 | 0 | — |
case-04 | fail→pass | 22,537 | 13,658 | -39% | 1 | 1 | 0% | 2,321 | 2,999 | +29% | 0 | 0 | — |
case-05 | fail→pass | 16,204 | 15,749 | -3% | 1 | 1 | 0% | 1,969 | 2,911 | +48% | 0 | 0 | — |
case-07 | pass→pass | 17,346 | 14,960 | -14% | 1 | 1 | 0% | 2,383 | 3,655 | +53% | 0 | 0 | — |
case-08 | pass→pass | 18,570 | 14,649 | -21% | 1 | 1 | 0% | 2,249 | 3,547 | +58% | 0 | 0 | — |
case-09 | fail→pass | 15,046 | 13,473 | -10% | 1 | 1 | 0% | 1,966 | 3,256 | +66% | 0 | 0 | — |
case-10 | pass→pass | 13,313 | 15,455 | +16% | 1 | 1 | 0% | 1,777 | 3,255 | +83% | 0 | 0 | — |
case-11 | fail→pass | 15,934 | 16,107 | +1% | 1 | 1 | 0% | 2,276 | 3,895 | +71% | 0 | 0 | — |
case-12 | pass→pass | 14,107 | 8,040 | -43% | 1 | 1 | 0% | 1,888 | 2,692 | +43% | 0 | 0 | — |
case-13 | pass→pass | 17,081 | 6,819 | -60% | 1 | 1 | 0% | 2,045 | 2,766 | +35% | 0 | 0 | — |
case-14 | pass→pass | 13,295 | 8,894 | -33% | 1 | 1 | 0% | 2,116 | 3,353 | +58% | 0 | 0 | — |
case-15 | pass→pass | 21,083 | 16,062 | -24% | 1 | 1 | 0% | 2,588 | 3,348 | +29% | 0 | 0 | — |
case-16 | pass→pass | 21,240 | 14,803 | -30% | 1 | 1 | 0% | 2,572 | 4,189 | +63% | 0 | 0 | — |
case-17 | pass→pass | 18,270 | 15,675 | -14% | 1 | 1 | 0% | 2,107 | 3,844 | +82% | 0 | 0 | — |
case-18 | fail→pass | 21,673 | 22,496 | +4% | 1 | 1 | 0% | 2,701 | 4,187 | +55% | 0 | 0 | — |
case-19 | fail→pass | 7,451 | 1,886 | -75% | 1 | 1 | 0% | 918 | 2,175 | +137% | 0 | 0 | — |
case-20 | pass→pass | 19,447 | 15,992 | -18% | 1 | 1 | 0% | 2,379 | 3,727 | +57% | 0 | 0 | — |
case-21 | pass→pass | 19,601 | 25,281 | +29% | 1 | 1 | 0% | 2,630 | 4,493 | +71% | 0 | 0 | — |
case-22 | pass→pass | 16,172 | 11,698 | -28% | 1 | 1 | 0% | 1,562 | 3,466 | +122% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +41 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.