tools/integrations/zapier.md
Workflow automation platform connecting 8,000+ apps. The Zapier SDK gives AI agents direct access to any app's actions without building OAuth flows or reverse-engineering APIs.
| Integration | Available | Notes |
|---|---|---|
| API | ✓ | REST API for Zaps, tasks, and webhooks |
| MCP | ✓ | Available via Zapier MCP server |
| CLI | ✓ | @zapier/zapier-sdk-cli for app discovery and type generation |
| SDK | ✓ | @zapier/zapier-sdk — TypeScript SDK for 8,000+ app integrations |
X-API-Key: {api_key}Browser-based login (development):
npx zapier-sdk login
Server-side (production):
ZAPIER_CREDENTIALS env varBrowser-based login only works locally. Use Client Credentials for any server-side deployment.
npm install @zapier/zapier-sdk
npm install -D @zapier/zapier-sdk-cli @types/node typescript
npm pkg set type=module
import { createZapierSdk } from "@zapier/zapier-sdk";
const zapier = createZapierSdk();
| Command | Purpose |
|---|---|
npx zapier-sdk login | Authenticate (dev only) |
npx zapier-sdk list-apps --search "query" | Search available apps |
npx zapier-sdk list-actions APP_KEY | List actions for an app |
npx zapier-sdk add [app-key] | Generate TypeScript types |
| Method | Purpose |
|---|---|
zapier.listConnections() | List authenticated app connections |
zapier.findFirstConnection() | Find a specific connection |
zapier.runAction() | Execute an action on a connected app |
zapier.apps.slack() | App proxy pattern for clean syntax |
zapier.fetch() | Custom authenticated API calls |
import { createZapierSdk } from "@zapier/zapier-sdk";
const zapier = createZapierSdk();
const slack = await zapier.apps.slack();
await slack.sendChannelMessage({
channel: "#marketing",
message: "Campaign launched!"
});
const hubspot = await zapier.apps.hubspot();
await hubspot.createContact({
email: "[email protected]",
firstName: "Jane",
lastName: "Doe"
});
Use .items() for large datasets:
const contacts = await hubspot.listContacts({ maxItems: 100 });
for await (const contact of contacts.items()) {
console.log(contact.email);
}
Direct API calls via zapier.fetch() are not subject to org app/action restriction policies. Use pre-built actions where possible if your org has governance requirements.
GET https://api.zapier.com/v1/zaps
GET https://api.zapier.com/v1/zaps/{zap_id}
POST https://api.zapier.com/v1/zaps/{zap_id}/on
POST https://api.zapier.com/v1/zaps/{zap_id}/off
GET https://api.zapier.com/v1/zaps/{zap_id}/tasks
GET https://api.zapier.com/v1/profiles/me
Create a "Webhooks by Zapier" trigger to receive data:
POST https://hooks.zapier.com/hooks/catch/{webhook_id}/
{
"event": "user.created",
"user_id": "123",
"email": "[email protected]"
}
Most common: trigger a Zap from your app:
POST https://hooks.zapier.com/hooks/catch/{account_id}/{hook_id}/
{
"name": "John Doe",
"email": "[email protected]",
"plan": "pro"
}
// Lead capture to CRM
const hubspot = await zapier.apps.hubspot();
await hubspot.createContact({ email, firstName, lastName });
// New customer notification
const slack = await zapier.apps.slack();
await slack.sendChannelMessage({ channel: "#revenue", message: `New customer: ${email}` });
// Add to email sequence
const customerio = await zapier.apps.customerio();
await customerio.createOrUpdatePerson({ email, plan: "pro" });
When sending to Zapier, structure data as flat JSON:
{
"customer_name": "John Doe",
"customer_email": "[email protected]",
"plan_name": "Pro",
"plan_price": 99,
"signup_date": "2024-01-15"
}