lindy-sdk-patterns
Provides integration patterns for Lindy AI, focusing on webhook triggers, HTTP request actions, and E2B code execution.
Install
mkdir -p .claude/skills/lindy-sdk-patterns && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/3066" && unzip -o skill.zip -d .claude/skills/lindy-sdk-patterns && rm skill.zipInstalls to .claude/skills/lindy-sdk-patterns
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
Lindy AI integration patterns for webhook handling, HTTP actions, andKey capabilities
- →Trigger Lindy agents via webhooks
- →Configure Lindy agents to call external APIs
- →Execute Python code within Lindy workflows
- →Execute JavaScript code within Lindy workflows
- →Implement asynchronous two-way communication with Lindy agents
- →Apply retry logic with exponential backoff for webhook triggers
How it works
The skill describes patterns for inbound webhooks to trigger agents, outbound HTTP requests from agents to external APIs, and inline Python/JavaScript execution in an E2B sandbox. It also covers callback mechanisms and retry strategies.
Inputs & outputs
When to use lindy-sdk-patterns
- →Set up webhook triggers for Lindy agents
- →Implement outbound HTTP actions from Lindy
- →Integrate Python or JS logic via Run Code actions
- →Optimize API usage for agent automation
About this skill
Lindy SDK & Integration Patterns
Overview
Lindy is primarily a no-code platform. External integration happens through three channels: Webhook triggers (inbound), HTTP Request actions (outbound), and Run Code actions (inline Python/JS execution via E2B sandbox). This skill covers patterns for each.
Prerequisites
- Lindy account with active agents
- Node.js 18+ or Python 3.10+ for webhook receivers
- Completed
lindy-install-authsetup
Pattern 1: Webhook Trigger Integration
Your application fires webhooks to wake Lindy agents:
// lindy-client.ts — Reusable Lindy webhook trigger client
class LindyClient {
private webhookUrl: string;
private secret: string;
constructor(webhookUrl: string, secret: string) {
this.webhookUrl = webhookUrl;
this.secret = secret;
}
async trigger(payload: Record<string, unknown>): Promise<{ status: number }> {
const response = await fetch(this.webhookUrl, {
method: 'POST',
headers: {
'Authorization': `Bearer ${this.secret}`,
'Content-Type': 'application/json',
},
body: JSON.stringify(payload),
});
if (!response.ok) {
throw new Error(`Lindy webhook failed: ${response.status} ${response.statusText}`);
}
return { status: response.status };
}
async triggerWithCallback(
payload: Record<string, unknown>,
callbackUrl: string
): Promise<{ status: number }> {
return this.trigger({ ...payload, callbackUrl });
}
}
// Usage
const lindy = new LindyClient(
'https://public.lindy.ai/api/v1/webhooks/YOUR_ID',
process.env.LINDY_WEBHOOK_SECRET!
);
await lindy.trigger({ event: 'lead.created', name: 'Jane Doe', email: '[email protected]' });
Pattern 2: HTTP Request Action (Agent Calling Your API)
Configure a Lindy agent to call your API as an action step:
In Lindy Dashboard — Add HTTP Request action:
-
Method: POST
-
URL:
https://api.yourapp.com/process -
Headers:
Authorization: Bearer {{your_api_key}},Content-Type: application/json -
Body (AI Prompt mode):
Send the processed data as JSON with fields matching the API schema. Include: name from {{trigger.data.name}}, analysis from previous step.
Your API endpoint receives the call:
// Your API receiving Lindy agent calls
app.post('/process', async (req, res) => {
const { name, analysis } = req.body;
const result = await processData(name, analysis);
res.json({ result, processedAt: new Date().toISOString() });
});
Pattern 3: Run Code Action (E2B Sandbox)
Execute Python or JavaScript directly in Lindy workflows. Code runs in isolated Firecracker microVMs with ~150ms startup time.
Python example (data transformation in a workflow):
# Run Code action — Python
# Input variables: raw_data (string from previous step)
import json
data = json.loads(raw_data) # Input vars are always strings
# Process
cleaned = [
{"name": item["name"].strip(), "score": float(item["score"])}
for item in data["items"]
if float(item["score"]) > 0.5
]
# Sort by score descending
cleaned.sort(key=lambda x: x["score"], reverse=True)
# Return value accessible as {{run_code.result}} in next step
return json.dumps({"filtered_count": len(cleaned), "items": cleaned})
JavaScript example (API call + processing):
// Run Code action — JavaScript
// Input variables: query (string), api_key (string)
const response = await fetch(`https://api.example.com/search?q=${query}`, {
headers: { 'Authorization': `Bearer ${api_key}` }
});
const data = await response.json();
const summary = data.results.map(r => `${r.title}: ${r.snippet}`).join('\n');
return JSON.stringify({ count: data.results.length, summary });
Run Code outputs (available to subsequent steps):
| Output | Contents |
|---|---|
{{run_code.result}} | Value from return statement |
{{run_code.text}} | stdout from print() / console.log() |
{{run_code.stderr}} | Error output for debugging |
Available Python libraries: pandas, numpy, scipy, scikit-learn, matplotlib, requests, aiohttp, beautifulsoup4, nltk, spacy, openpyxl, python-docx
Key constraint: All input variables arrive as strings. Cast explicitly:
count = int(count_str), data = json.loads(json_str)
Pattern 4: Callback Pattern (Async Two-Way)
Send a callbackUrl in your webhook payload. Lindy can respond back using
the Send POST Request to Callback action:
// Your app triggers Lindy with a callback URL
await lindy.trigger({
event: 'analyze.request',
data: { text: 'Analyze this quarterly report...' },
callbackUrl: 'https://api.yourapp.com/lindy-callback'
});
// Your callback handler receives Lindy's response
app.post('/lindy-callback', (req, res) => {
const { analysis, sentiment, summary } = req.body;
saveAnalysis(analysis);
res.sendStatus(200);
});
Pattern 5: Retry with Exponential Backoff
async function triggerWithRetry(
client: LindyClient,
payload: Record<string, unknown>,
maxRetries = 3
): Promise<void> {
for (let attempt = 0; attempt <= maxRetries; attempt++) {
try {
await client.trigger(payload);
return;
} catch (error: any) {
if (attempt === maxRetries) throw error;
const delay = Math.pow(2, attempt) * 1000; // 1s, 2s, 4s
console.warn(`Retry ${attempt + 1}/${maxRetries} in ${delay}ms`);
await new Promise(r => setTimeout(r, delay));
}
}
}
Error Handling
| Pattern | Failure Mode | Solution |
|---|---|---|
| Webhook trigger | 401 Unauthorized | Verify Bearer token matches dashboard secret |
| HTTP Request action | Target API unreachable | Check URL, verify HTTPS, test with curl |
| Run Code | Timeout | Avoid infinite loops; keep execution under 30s |
| Run Code | Import error | Use only pre-installed libraries (see list above) |
| Callback | Callback URL unreachable | Ensure HTTPS endpoint is publicly accessible |
Resources
Next Steps
Proceed to lindy-core-workflow-a for full agent creation workflows.
When not to use it
- →When integrating with Lindy is not required
- →When a no-code solution is preferred for all integrations
Prerequisites
Limitations
- →Run Code actions have a timeout of 30 seconds
- →Only pre-installed libraries are available for Run Code actions
- →All input variables to Run Code actions arrive as strings
How it compares
This skill provides structured patterns for integrating external applications with Lindy AI agents, offering programmatic control beyond the platform's no-code interface.
Compared to similar skills
lindy-sdk-patterns side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| lindy-sdk-patterns (this skill) | 1 | 27d | Caution | Intermediate |
| telegram-bot-builder | 106 | 6mo | Review | Intermediate |
| reddit-api | 3 | 4mo | Review | Intermediate |
| juicebox-install-auth | 2 | 27d | Review | Beginner |
Try saying
Example prompts that trigger this skill in your AI assistant.
More by jeremylongshore
View all by jeremylongshore →You might also like
telegram-bot-builder
davila7
Expert in building Telegram bots that solve real problems - from simple automation to complex AI-powered bots. Covers bot architecture, the Telegram Bot API, user experience, monetization strategies, and scaling bots to thousands of users. Use when: telegram bot, bot api, telegram automation, chat bot telegram, tg bot.
reddit-api
alinaqi
Reddit API with PRAW (Python) and Snoowrap (Node.js)
juicebox-install-auth
jeremylongshore
Install and configure Juicebox SDK/CLI authentication. Use when setting up a new Juicebox integration, configuring API keys, or initializing Juicebox in your project. Trigger with phrases like "install juicebox", "setup juicebox", "juicebox auth", "configure juicebox API key".
windsurf-mcp-integration
jeremylongshore
Manage integrate MCP servers with Windsurf for extended capabilities. Activate when users mention "mcp integration", "model context protocol", "external tools", "mcp server", or "cascade tools". Handles MCP server configuration and integration. Use when working with windsurf mcp integration functionality. Trigger with phrases like "windsurf mcp integration", "windsurf integration", "windsurf".
groq-webhooks-events
jeremylongshore
Implement Groq webhook signature validation and event handling. Use when setting up webhook endpoints, implementing signature verification, or handling Groq event notifications securely. Trigger with phrases like "groq webhook", "groq events", "groq webhook signature", "handle groq events", "groq notifications".
emailable-automation
onfire7777
Automate Emailable tasks via Rube MCP (Composio). Always search tools first for current schemas.