From lindy-pack
Sets up Lindy AI inbound webhook triggers, outbound HTTP requests, and async callbacks for event-driven agent integrations.
npx claudepluginhub jeremylongshore/claude-code-plugins-plus-skills --plugin lindy-packThis skill is limited to using the following tools:
Lindy supports webhooks in two directions: **Inbound** (Webhook Received trigger
Provides Lindy AI integration patterns for webhook triggers from code, HTTP requests to APIs, and Run Code actions with Python/JavaScript.
Mandates invoking relevant skills via tools before any response in coding sessions. Covers access, priorities, and adaptations for Claude Code, Copilot CLI, Gemini CLI.
Share bugs, ideas, or general feedback.
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"} |
// 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:
// 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/endpointContent-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 100
This 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 inbox
Webhook 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 output
Lindy 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.