| Zapier SDK for TypeScript. Programmatic access to 9,000+ apps on a user's behalf via Zapier's OAuth and audit layer. Use when writing code that needs to run actions in third-party apps (send an email, upsert a CRM record, look up a spreadsheet row, post to a chat) without managing per-app OAuth or "run zapier action", "connect to app via zapier", "zapier connection", "zapier tables", "list actions for zapier app", "getActionInputFieldsSchema", "createZapierSdk".
npx skills add https://github.com/zapier/sdk --skill zapier-sdk
Connect your app, agent, or backend to 9,000+ integrations with a few lines of code. Run actions, manage user connections, chain apps together. The SDK handles token refresh, retries, and API differences.
The Zapier SDK is the code interface to Zapier. It gives coding agents and AI builders programmatic, governed access to 9,000+ apps, running inside editors like Cursor, Claude Code, or VS Code.
Two sibling interfaces share the same capabilities:
@zapier/zapier-sdk-cli package): terminal interface (npx zapier-sdk ...) for one-off commands, exploration, scripting. Read references/cli.md when the user wants shell access instead of code.Pick the SDK when the deliverable is code. If the user wants ad-hoc tool calls in an AI chat interface, point them to MCP.
Two SDK shapes to distinguish:
@zapier/zapier-durable): the user *deploys* a workflow that Zapier's infrastructure runs on a trigger (webhook, poll, schedule). Retries stay idempotent via ctx.step. Read references/workflows.md when the user wants deployment on Zapier's infrastructure instead of running the code themselves.The SDK ships two packages: a TypeScript library and a CLI. Install whichever you need.
Check what's already installed:
# Is the SDK library present?
ls node_modules/@zapier/zapier-sdk 2>/dev/null && echo "SDK installed" || echo "SDK not installed"
# Is the CLI available?
npx zapier-sdk --version 2>/dev/null && echo "CLI installed" || echo "CLI not installed"
# Are you logged in? (returns email + account on success, non-zero exit if not)
npx zapier-sdk get-profile
There is no whoami, no status, no auth. The command for "who am I logged in as" is get-profile. Use zapier-sdk --help before guessing any other command name.
If missing:
# SDK library.
npm install @zapier/zapier-sdk
# CLI plus TypeScript dev deps.
npm install -D @zapier/zapier-sdk-cli @types/node typescript
# Authenticate (opens a browser).
npx zapier-sdk login
Full quickstart: https://docs.zapier.com/sdk
Setup requires browser-based login via npx zapier-sdk login. Offer to guide setup step-by-step only after user confirmation.
The Zapier SDK (@zapier/zapier-sdk) is new. Your training data does not contain accurate information about this SDK. Do not guess API methods or patterns.
zapier-sdk list-apps --search <term> or zapier.listApps({ search }) first.zapier-sdk list-actions <app> or zapier.listActions({ app }) first.zapier-sdk list-action-input-fields <app> <type> <action> against the live connection.Prefer the default output for reading. It already includes slug, key, title, action type, and description in a compact form. Pass --json only when you need to pipe into jq or another tool. --json is a per-command flag (it appears on every subcommand's --help, not on zapier-sdk --help).
# Find apps. --search is a substring match, so `notion` returns Motion,
# Potion, Tree-Nation too. Read the default output to confirm you picked
# the right app before moving on.
npx zapier-sdk list-apps --search notion
# List actions on an app. Short slugs like `notion` work everywhere in
# the CLI. Filter by type to trim the list.
npx zapier-sdk list-actions notion --action-type search
# Inspect an action's inputs. Many are dynamic, so verify against a
# live connection.
npx zapier-sdk list-action-input-fields notion search page_by_title
# Run an action end-to-end. Use --json when you want to parse the result.
CONN=$(npx zapier-sdk find-first-connection notion --json | jq -r '.data.id')
npx zapier-sdk run-action notion search page_by_title \
--connection "$CONN" \
--inputs '{"title":"Meeting Notes","exact_match":"no"}' \
--json
The CLI's run-action accepts the short slug (notion, slack, github), the CLIAPI-suffixed form (NotionCLIAPI), or a versioned ID. The CLIAPI-suffix requirement in the "Gotchas" section applies to the typed SDK library method (sdk.runAction), not the CLI.
Full CLI walkthrough: references/cli.md. Complete command inventory: references/cli-commands.md.
The SDK supports two auth modes. Browser login is the default for local development:
import { createZapierSdk } from "@zapier/zapier-sdk";
// Option 1: browser-based (local dev). Requires `npx zapier-sdk login` first.
const zapier = createZapierSdk();
// Option 2: client credentials (server / CI).
const zapier = createZapierSdk({
credentials: { clientId: "...", clientSecret: "..." },
});
Every action needs a *connection* (an OAuth grant Zapier holds for a specific app + user). Check if one exists:
// Throws ZapierResourceNotFoundError if no match. Wrap in try/catch, or listConnections() first.
const { data: connection } = await zapier.findFirstConnection({
app: "notion",
owner: "me",
expired: false,
});
If none exists, the user has to complete OAuth in a browser. This step cannot be fully automated: a human must click "authorize" for their account.
npx zapier-sdk create-connection notion # opens a browser, waits for OAuth
For agent-driven flows: use get-connection-start-url <app> to fetch the URL, present it to the user, then wait-for-new-connection <app> <started-at> to block until they finish.
Action types: read (list data), write (create/update), search (find specific records).
// Generic form (works for any app + action). Preferred.
const { data } = await zapier.runAction({
appKey: "NotionCLIAPI",
actionType: "search",
actionKey: "page_by_title",
connection: connection.id,
inputs: { title: "Meeting Notes", exact_match: "no" },
});
For actions on the stable typed surface (documented in the SDK reference), a typed shorthand zapier.apps.<app>.<type>.<action>({ inputs }) is available. Check the reference for coverage; not every app is typed.
// What can this app do?
for await (const action of zapier.listActions({ app: "notion" }).items()) {
console.log(action.key, action.action_type, action.label);
}
// What inputs does an action need?
const { data: schema } = await zapier.getActionInputFieldsSchema({
app: "notion",
actionType: "search",
action: "page_by_title",
});
create-connection opens a browser for the user. Agents must surface the URL and wait for the human. See "1. Find or create a connection" above.is_hidden: true actions are not on the stable surface. They may work at runtime, but Zapier makes no promises they'll keep working. Filter them out of list-actions results before picking an action key.connection.id (UUID) to runAction. Inside a durable workflow (@zapier/zapier-durable), pass a string alias like "notion_primary" that the runtime resolves at deploy time. Don't mix them up.runAction returns { data: T[] }, always an array. Search-style actions typically return one row; downstream code destructures data: [result]. Write actions also return an array (usually one element).list-action-input-fields against the live connection before authoring.runAction wants the CLIAPI-suffixed form. In TypeScript, sdk.runAction({ appKey }) requires "NotionCLIAPI". Get it from list-apps or list-actions. Everywhere else (the CLI's run-action, sdk.findFirstConnection, sdk.listActions, and so on) accepts either the short slug ("notion") or the CLIAPI form.findFirstConnection / find-first-connection and take the first result. Don't stop to disambiguate unless the user explicitly asks; filter by title or owner if you need a specific one.run-action, upstream rate limits (Slack, HubSpot, Notion) come back as ZAPIER_ACTION_ERROR with a message ending ..., N) where N is Retry-After in seconds. Sleep N, then retry. Throttle bursts; don't rely on --max-network-retries to catch these.The SDK covers these categories: Apps, Actions, Connections, HTTP, Tables, Auth (client credentials), Profile.
Do not guess method signatures. Look them up in the canonical reference. Prefer the bundled README when @zapier/zapier-sdk is already installed (version-locked to the installed package, grep-able offline):
node_modules/@zapier/zapier-sdk/README.mdWhen paginating a list-* call, see references/pagination.md for the three patterns the SDK supports.
Make raw API calls through Zapier's auth infrastructure when no first-class action exists:
const response = await zapier.fetch("https://api.example.com/data", {
connection: connection.id,
method: "GET",
});
Same auth and audit trail as runAction. Use this when the app's Zapier action catalog doesn't cover what you need (bulk reads, custom endpoints, partner-specific APIs).
For fill-in-the-blank skeletons (plain script, Zapier Table, durable workflow), see references/examples.md. These are shape-only; the real, action-key-verified corpus is at https://github.com/zapier/sdk/tree/main/examples. Grep the corpus by app or pattern when you need a working reference.
Guide for creating high-quality MCP (Model Context Protocol) servers that enable LLMs to interact with external services through well-designed tools. Use when building MCP servers to integrate external APIs or services, whether in Python (FastMCP) or Node/TypeScript (MCP SDK).
Automatically creates user-facing changelogs from git commits by analyzing commit history, categorizing changes, and transforming technical commits into clear, customer-friendly release notes. Turns hours of manual changelog writing into minutes of automated generation.
Use when implementation is complete, all tests pass, and you need to decide how to integrate the work - guides completion of development work by presenting structured options for merge, PR, or cleanup
Guide for creating high-quality MCP (Model Context Protocol) servers that enable LLMs to interact with external services through well-designed tools. Use when building MCP servers to integrate external APIs or services, whether in Python (FastMCP) or Node/TypeScript (MCP SDK).
React Native and Expo best practices for building performant mobile apps. Use when building React Native components, optimizing list performance, implementing animations, or working with native modules. Triggers on tasks involving React Native, Expo, mobile performance, or native platform APIs.
React and Next.js performance optimization guidelines from Vercel Engineering. This skill should be used when writing, reviewing, or refactoring React/Next.js code to ensure optimal performance patterns. Triggers on tasks involving React components, Next.js pages, data fetching, bundle optimization, or performance improvements.
Next.js best practices - file conventions, RSC boundaries, data patterns, async APIs, metadata, error handling, route handlers, image/font optimization, bundling
Use when starting feature work that needs isolation from current workspace or before executing implementation plans - creates isolated git worktrees with smart directory selection and safety verification
Take zapier/zapier-sdk from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.
The instructions reference npm, npx.
Without those the skill loads but fails at the first command.