> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Zapier SDK

> Let your agent connect to anything. Zapier handles the keys.

export const appCountExact = "9,000";

export const appCount = "9,000+";

<Info>
  **The Zapier SDK is now in open beta.** Access is free — try it, break it, and
  tell us what to fix. [Give feedback →](https://npsup.zapier.app/contact-us?product=Zapier%20SDK)
</Info>

<a className="cta-button" href="/sdk/quickstart" data-cta-target="sdk_quickstart" data-cta-goal="start_quickstart">
  Try it with one command →
</a>

The SDK gives coding agents and builders programmatic access to Zapier's full app ecosystem. Any API call, on behalf of a user, with no OAuth setup required. Where MCP gives agents a curated menu of pre-built actions, the SDK lets agents go further: write loops, handle edge cases, chain complex logic across apps.

Zapier handles auth, token refresh, retries, and API quirks across {appCount} integrations. Your agent handles the logic.

<Columns cols={2}>
  <Card title="For coding agents">
    Agents can write code in seconds. What they can't do is manage OAuth at
    scale, handle webhook subscriptions, or enforce enterprise permissions. The
    SDK is the interface agents reach for when they need to connect to an app,
    take an action, or respond to an event without setting up the auth
    infrastructure every time.
  </Card>

  <Card title="For builders of AI products">
    Every builder working with agents is either solving the auth problem
    themselves — OAuth for each app, token refresh, retries — or going without
    it entirely (ungoverned, unaudited). The SDK replaces that with one
    integration, backed by the same infrastructure running Zapier's full app
    catalog.
  </Card>
</Columns>

## SDK or MCP — Which One Do You Need?

|              | MCP                                                 | SDK                                                                                         |
| :----------- | :-------------------------------------------------- | :------------------------------------------------------------------------------------------ |
| Best for     | Chat agents                                         | Coding agents                                                                               |
| Access model | Curated menu of pre-built actions                   | Any API call, in code, authenticated by Zapier                                              |
| Use when     | You want a fast, governed set of tools for an agent | You need loops, conditionals, error handling, or calls that go beyond the pre-built catalog |

Most teams end up using both. MCP for conversational agent interfaces; SDK when those agents need to execute code reliably in production.

## What's Available in Open Beta

### In now

* **Full action catalog** — invoke any of {appCount} pre-built actions across Zapier's full app catalog through one programmable interface
* **API call** — raw authenticated HTTP calls to \~3,600 app APIs via Zapier's infrastructure; go beyond pre-built actions to call any supported endpoint directly (more coming soon!)
* **App and action governance** — if your org has restricted specific apps or actions inside Zapier, those policies apply automatically to SDK traffic that uses pre-built actions
* **Free during early access** — no billing changes during the open beta window

### Experimental

* **[Using Triggers](/sdk/using-triggers)** — subscribe to real-time events across connected apps in code; Zapier handles subscription state and webhook reliability.
* **[Permissions](/sdk/permissions)** — review and approve what an agent can do before it acts on your behalf; build reusable allow/deny rules over time.

### Coming soon

* **Self-serve enterprise opt-in/out** — workspace admins toggle SDK access directly, no ticket required
* **Direct API governance** — today, governance applies to pre-built actions only; direct API calls are not yet governable at the policy level. Direct API governance is in progress.

### Not in scope for open beta

* Full raw API call coverage across *all* {appCountExact} apps

<Warning>
  **Enterprise and Team plans:** These accounts are off by default. [Contact
  us](https://npsup.zapier.app/contact-us?product=Zapier%20SDK) for manual opt-in.
</Warning>

## A Note on Governance

App and action restrictions your org has set up in Zapier apply automatically to SDK pre-built actions — no extra configuration. However, the SDK also provides direct API access via `.fetch()`, which currently falls outside those policy controls.

<Warning>
  **Important:** If your agent calls a pre-built action, that action is
  governed. If it calls the underlying API endpoint directly via `.fetch()`, it
  is not yet governed. Direct API governance is on the roadmap.
</Warning>

## Key Features

* **{appCount} App Integrations**: Access Zapier's entire ecosystem of pre-built connectors
* **Type-Safe**: Full TypeScript support with generated types for every app and action
* **Simple Authentication**: Browser-based signup/login, client credentials, or direct token for seamless auth
* **Paginated Results**: Simple pagination and iteration over lists of resources
* **Built-in Actions**: Easily call our built-in actions with a simple `apps.slack.write.channel_message()` syntax.
* **Custom API Requests**: Use our `fetch` method and make authenticated requests to any API through Zapier's infrastructure to go beyond our built-in actions

## Get Started

**Your agent runs the commands for you**

<CardGroup cols={2}>
  <Card title="Open in Codex" icon="https://mintcdn.com/zapier-82f0e938/rR3XBX59eJV84aG0/images/logos/branded/openai.svg?fit=max&auto=format&n=rR3XBX59eJV84aG0&q=85&s=b8031fcd753c6c37e0528a300f79513d" href="codex://new?prompt=Set%20up%20the%20Zapier%20SDK%20for%20me.%20Before%20installing%20anything%3A%0A%0A-%20Run%20%60pwd%60%20and%20tell%20me%20the%20current%20folder.%0A-%20Ask%20whether%20to%20install%20here%20or%20somewhere%20else.%0A%0AEnd%20with%3A%20%22Should%20I%20set%20up%20here%2C%20or%20do%20you%20want%20to%20point%20me%20at%20a%20different%20directory%3F%22%20Then%20STOP%20and%20wait.%20If%20I%20name%20a%20different%20directory%2C%20%60cd%60%20there%20first%2C%20creating%20it%20with%20%60mkdir%20-p%60%20if%20needed.%20If%20my%20reply%20is%20ambiguous%2C%20use%20the%20current%20directory.%0A%0AAfter%20I%20confirm%20the%20directory%2C%20work%20through%20these%20steps%20one%20at%20a%20time.%20Run%20each%20command%20in%20the%20terminal%2C%20report%20what%20happened%2C%20then%20continue.%0A%0A1.%20Detect%20the%20package%20manager.%0A%20%20%20Check%20for%20pnpm-lock.yaml%2C%20yarn.lock%2C%20bun.lockb%2C%20or%20package-lock.json.%20If%20one%20exists%2C%20use%20that%20manager%20for%20every%20install%20command.%20If%20none%20exist%2C%20use%20npm.%0A%0A2.%20Ensure%20a%20project%20exists.%0A%20%20%20-%20If%20package.json%20exists%2C%20use%20the%20project%20as-is%20and%20remember%20this%20for%20step%209.%0A%20%20%20-%20If%20package.json%20is%20missing%2C%20create%20one%3A%20npm%20init%20-y%0A%0A3.%20Check%20Node.js%20is%20installed%20at%20version%2020%20or%20higher%3A%20node%20-v%0A%20%20%20-%20If%20Node%20is%20missing%2C%20tell%20me%20to%20install%20it%20from%20https%3A%2F%2Fnodejs.org%20or%20run%20brew%20install%20node%2C%20then%20stop.%0A%20%20%20-%20If%20Node%20is%20older%20than%2020%2C%20tell%20me%20to%20upgrade%20it%2C%20then%20stop.%0A%0A4.%20Install%20the%20SDK%3A%20npm%20install%20%40zapier%2Fzapier-sdk%0A%20%20%20-%20An%20EPERM%20error%20on%20~%2F.npm%2F_cacache%20usually%20means%20the%20command%20sandbox%20is%20blocking%20npm%20cache%20writes%2C%20not%20that%20file%20permissions%20are%20broken.%0A%0A5.%20Install%20dev%20dependencies%3A%20npm%20install%20-D%20%40zapier%2Fzapier-sdk-cli%20%40types%2Fnode%20typescript%20tsx%0A%0A6.%20Ask%20whether%20to%20install%20the%20optional%20Zapier%20SDK%20skill%20for%20agent%20context.%0A%20%20%20Say%3A%20%22Do%20you%20want%20me%20to%20install%20the%20optional%20Zapier%20SDK%20skill%20for%20extra%20agent%20context%3F%20It%20is%20not%20required%20for%20SDK%20setup.%22%20Then%20STOP%20and%20wait.%0A%20%20%20-%20If%20I%20clearly%20say%20yes%2C%20run%3A%20npx%20skills%20add%20zapier%2Fsdk%20-y%0A%20%20%20-%20Otherwise%2C%20skip%20this%20step%20and%20continue.%0A%0A7.%20Authenticate%20with%20Zapier.%0A%20%20%20First%20ask%3A%20%22Are%20you%20signing%20up%20or%20logging%20in%3F%20Am%20I%20running%20on%20your%20local%20machine%20with%20a%20browser%2C%20or%20in%20a%20remote%2Fheadless%20environment%20like%20Telegram%20or%20Discord%3F%22%20Then%20STOP%20and%20wait.%20Do%20not%20infer%20the%20environment.%0A%20%20%20-%20If%20I%20do%20not%20have%20a%20Zapier%20account%20and%20we%20are%20in%20a%20remote%20environment%20like%20Telegram%20or%20Discord%2C%20run%3A%20npx%20zapier-sdk%20signup%20--non-interactive%20--headless%0A%20%20%20-%20If%20I%20do%20not%20have%20a%20Zapier%20account%20and%20you%20are%20running%20on%20my%20machine%2C%20run%3A%20npx%20zapier-sdk%20signup%20--non-interactive%0A%20%20%20-%20If%20I%20already%20have%20a%20Zapier%20account%20and%20we%20are%20in%20a%20remote%20environment%20like%20Telegram%20or%20Discord%2C%20run%3A%20npx%20zapier-sdk%20login%20--non-interactive%20--headless%0A%20%20%20-%20If%20I%20already%20have%20a%20Zapier%20account%20and%20you%20are%20running%20on%20my%20machine%2C%20run%3A%20npx%20zapier-sdk%20login%20--non-interactive%0A%20%20%20-%20If%20unsure%2C%20ask%20whether%20to%20sign%20up%20or%20log%20in%2C%20and%20whether%20you%20are%20local%20or%20remote%2C%20before%20running%20any%20auth%20command.%0A%20%20%20-%20Use%20--headless%20when%20auth%20must%20happen%20through%20a%20browser%20outside%20this%20terminal.%20Show%20me%20the%20printed%20URL%20and%20pass%20the%20final%20OAuth%20callback%20URL%20back%20to%20the%20waiting%20command%20when%20I%20provide%20it.%0A%20%20%20-%20Browser%20signup%2Flogin%20opens%20a%20browser.%20A%20permissions%20or%20sandbox%20error%20usually%20means%20credentials%20could%20not%20be%20written%20to%20disk.%0A%20%20%20-%20If%20authentication%20fails%20for%20another%20reason%2C%20try%20once%20more.%0A%20%20%20-%20After%20authentication%20succeeds%2C%20confirm%20the%20email%20from%20the%20CLI%20output.%0A%0A8.%20List%20my%20connected%20apps%3A%20npx%20zapier-sdk%20list-connections%20--owner%20me%20--json%202%3E%2Fdev%2Fnull%20%7C%20head%20-n%201000%0A%20%20%20-%20Show%20only%20the%20first%2010%20results%20as%20a%20markdown%20table%20with%20columns%3A%20ID%2C%20App%20Key%2C%20Expired.%20Do%20not%20show%20Title.%0A%20%20%20-%20Tell%20me%20how%20many%20total%20connections%20there%20are.%20If%20there%20are%20more%20than%2010%2C%20say%20you%20are%20only%20showing%20the%20first%2010.%0A%20%20%20-%20The%20page%20size%20is%20100.%20If%20exactly%20100%20connections%20return%2C%20note%20that%20more%20may%20exist%2C%20but%20do%20not%20fetch%20more%20pages.%0A%20%20%20-%20If%20the%20list%20is%20empty%2C%20tell%20me%20to%20connect%20at%20least%20one%20app%20at%20https%3A%2F%2Fzapier.com%2Fapp%2Fassets%2Fconnections%20and%20come%20back.%0A%0A9.%20If%20this%20was%20an%20existing%20project%20from%20step%202%2C%20scan%20the%20codebase%20and%20suggest%202-3%20concrete%20ways%20to%20integrate%20the%20Zapier%20SDK.%20Reference%20real%20files%20and%20patterns%20you%20find%2C%20for%20example%20an%20API%20route%2C%20tool%20registry%2C%20backend%20service%2C%20or%20sync%20script.%20If%20this%20is%20a%20fresh%20project%2C%20skip%20this%20step.%0A%0AWhen%20setup%20is%20done%2C%20tell%20me%20I%20am%20ready%20and%20explain%3A%0A%0AZapier%20has%20pre-built%20connectors%20for%209%2C000%2B%20apps%2C%20including%20Slack%2C%20Google%20Sheets%2C%20Salesforce%2C%20GitHub%2C%20and%20thousands%20more.%20The%20SDK%20and%20CLI%20expose%20that%20integration%20layer%20to%20code%2C%20so%20you%20do%20not%20have%20to%20build%20OAuth%2C%20token%20refresh%2C%20retries%2C%20or%20each%20app%20API%20yourself.%20My%20existing%20Zapier%20connections%20are%20authenticated%20and%20ready%20to%20use.%0A%0A-%20**TypeScript%20SDK%3A**%20for%20production%20integrations%2C%20backend%20services%2C%20scheduled%20workflows%2C%20and%20agent%20tools.%20It%20is%20type-safe%2C%20handles%20token%20refresh%20and%20retries%2C%20and%20uses%20the%20same%20app%20keys%2C%20action%20keys%2C%20and%20input%20shapes%20discovered%20through%20the%20CLI.%20SDK%20reference%3A%20https%3A%2F%2Fdocs.zapier.com%2Fsdk%2Freference%0A-%20**CLI%3A**%20for%20exploration%20and%20ad-hoc%20actions.%20Use%20it%20to%20inspect%20apps%2C%20fields%2C%20and%20actions%2C%20then%20run%20one-offs%20from%20a%20terminal%20or%20agent.%20CLI%20reference%3A%20https%3A%2F%2Fdocs.zapier.com%2Fsdk%2Fcli-reference%0A%0A**Want%20to%20run%20a%20quick%20test%3F**%0A%0AIf%20I%20have%20a%20Slack%20connection%2C%20offer%20to%20send%20me%20a%20DM%20on%20Slack%20using%20the%20SDK.%20Describe%20what%20will%20happen%20and%20end%20with%3A%20%22Want%20to%20run%20this%20quick%20test%3F%22%20Then%20STOP%20and%20wait.%20Do%20not%20output%20anything%20else.%20If%20I%20do%20not%20have%20a%20Slack%20connection%2C%20skip%20the%20test.%0A%0AOnly%20proceed%20with%20the%20test%20if%20my%20reply%20is%20clearly%20affirmative%2C%20such%20as%20%22yes%22%20or%20%22go%20ahead%22.%20If%20ambiguous%2C%20skip%20the%20test%20and%20continue.%0A%0AWhen%20I%20say%20yes%2C%20create%20src%2Fzapier-slack-test.ts%20with%20code%20that%3A%0A%0A1.%20Looks%20up%20my%20Slack%20user%20by%20email%20using%20sdk.runAction(%22slack%22%2C%20%22search%22%2C%20%22user_by_email%22%2C%20%7B%20connectionId%3A%20ID%2C%20inputs%3A%20%7B%20email%3A%20%22ZAPIER_EMAIL%22%20%7D%20%7D).%0A2.%20Sends%20a%20DM%20to%20myself%20using%20sdk.runAction(%22slack%22%2C%20%22write%22%2C%20%22direct_message%22%2C%20%7B%20connectionId%3A%20ID%2C%20inputs%3A%20%7B%20channel%3A%20%22USERNAME%22%2C%20text%3A%20%22Hello%20via%20Zapier%20SDK%22%20%7D%20%7D).%0A%0AReplace%20ID%2C%20ZAPIER_EMAIL%2C%20and%20USERNAME%20with%20real%20values%20from%20earlier%20steps.%20Run%20it%20with%20npx%20tsx%20src%2Fzapier-slack-test.ts.%20If%20user_by_email%20fails%2C%20ask%20for%20my%20Slack%20email%20and%20try%20again.%0A%0AAfter%20the%20test%20completes%2C%20is%20skipped%2C%20or%20there%20is%20no%20Slack%20connection%3A%0A%0A-%20Pick%201-3%20apps%20from%20the%20connections%20table%20and%20show%20commands%20I%20can%20use%20to%20explore%20their%20actions%2C%20such%20as%3A%20npx%20zapier-sdk%20list-actions%20APP_KEY%0A-%20Do%20not%20run%20those%20commands.%0A-%20Suggest%203%20specific%20ideas%20based%20on%20my%20connected%20apps.%20Each%20idea%20should%20read%20from%20one%20app%2C%20optionally%20process%20data%2C%20and%20write%20to%20another.%20Do%20not%20suggest%20event-driven%20workflows.%20Keep%20each%20idea%20to%20one%20sentence.%20Example%3A%20%22pull%20in-progress%20Jira%20issues%20and%20DM%20yourself%20a%20summary%20on%20Slack%22." horizontal width="16" height="16" data-path="images/logos/branded/openai.svg" />

  <Card title="Open in Claude Code" icon="https://mintcdn.com/zapier-82f0e938/rR3XBX59eJV84aG0/images/logos/branded/claude.svg?fit=max&auto=format&n=rR3XBX59eJV84aG0&q=85&s=9f0b8f48afbdf67c84f41b94925bdfe4" href="claude://code/new?q=Set%20up%20the%20Zapier%20SDK%20for%20me.%20Before%20installing%20anything%3A%0A%0A-%20Run%20%60pwd%60%20and%20tell%20me%20the%20current%20folder.%0A-%20Ask%20whether%20to%20install%20here%20or%20somewhere%20else.%0A%0AEnd%20with%3A%20%22Should%20I%20set%20up%20here%2C%20or%20do%20you%20want%20to%20point%20me%20at%20a%20different%20directory%3F%22%20Then%20STOP%20and%20wait.%20If%20I%20name%20a%20different%20directory%2C%20%60cd%60%20there%20first%2C%20creating%20it%20with%20%60mkdir%20-p%60%20if%20needed.%20If%20my%20reply%20is%20ambiguous%2C%20use%20the%20current%20directory.%0A%0AAfter%20I%20confirm%20the%20directory%2C%20work%20through%20these%20steps%20one%20at%20a%20time.%20Run%20each%20command%20in%20the%20terminal%2C%20report%20what%20happened%2C%20then%20continue.%0A%0A1.%20Detect%20the%20package%20manager.%0A%20%20%20Check%20for%20pnpm-lock.yaml%2C%20yarn.lock%2C%20bun.lockb%2C%20or%20package-lock.json.%20If%20one%20exists%2C%20use%20that%20manager%20for%20every%20install%20command.%20If%20none%20exist%2C%20use%20npm.%0A%0A2.%20Ensure%20a%20project%20exists.%0A%20%20%20-%20If%20package.json%20exists%2C%20use%20the%20project%20as-is%20and%20remember%20this%20for%20step%209.%0A%20%20%20-%20If%20package.json%20is%20missing%2C%20create%20one%3A%20npm%20init%20-y%0A%0A3.%20Check%20Node.js%20is%20installed%20at%20version%2020%20or%20higher%3A%20node%20-v%0A%20%20%20-%20If%20Node%20is%20missing%2C%20tell%20me%20to%20install%20it%20from%20https%3A%2F%2Fnodejs.org%20or%20run%20brew%20install%20node%2C%20then%20stop.%0A%20%20%20-%20If%20Node%20is%20older%20than%2020%2C%20tell%20me%20to%20upgrade%20it%2C%20then%20stop.%0A%0A4.%20Install%20the%20SDK%3A%20npm%20install%20%40zapier%2Fzapier-sdk%0A%20%20%20-%20An%20EPERM%20error%20on%20~%2F.npm%2F_cacache%20usually%20means%20the%20command%20sandbox%20is%20blocking%20npm%20cache%20writes%2C%20not%20that%20file%20permissions%20are%20broken.%0A%0A5.%20Install%20dev%20dependencies%3A%20npm%20install%20-D%20%40zapier%2Fzapier-sdk-cli%20%40types%2Fnode%20typescript%20tsx%0A%0A6.%20Ask%20whether%20to%20install%20the%20optional%20Zapier%20SDK%20skill%20for%20agent%20context.%0A%20%20%20Say%3A%20%22Do%20you%20want%20me%20to%20install%20the%20optional%20Zapier%20SDK%20skill%20for%20extra%20agent%20context%3F%20It%20is%20not%20required%20for%20SDK%20setup.%22%20Then%20STOP%20and%20wait.%0A%20%20%20-%20If%20I%20clearly%20say%20yes%2C%20run%3A%20npx%20skills%20add%20zapier%2Fsdk%20-y%0A%20%20%20-%20Otherwise%2C%20skip%20this%20step%20and%20continue.%0A%0A7.%20Authenticate%20with%20Zapier.%0A%20%20%20First%20ask%3A%20%22Are%20you%20signing%20up%20or%20logging%20in%3F%20Am%20I%20running%20on%20your%20local%20machine%20with%20a%20browser%2C%20or%20in%20a%20remote%2Fheadless%20environment%20like%20Telegram%20or%20Discord%3F%22%20Then%20STOP%20and%20wait.%20Do%20not%20infer%20the%20environment.%0A%20%20%20-%20If%20I%20do%20not%20have%20a%20Zapier%20account%20and%20we%20are%20in%20a%20remote%20environment%20like%20Telegram%20or%20Discord%2C%20run%3A%20npx%20zapier-sdk%20signup%20--non-interactive%20--headless%0A%20%20%20-%20If%20I%20do%20not%20have%20a%20Zapier%20account%20and%20you%20are%20running%20on%20my%20machine%2C%20run%3A%20npx%20zapier-sdk%20signup%20--non-interactive%0A%20%20%20-%20If%20I%20already%20have%20a%20Zapier%20account%20and%20we%20are%20in%20a%20remote%20environment%20like%20Telegram%20or%20Discord%2C%20run%3A%20npx%20zapier-sdk%20login%20--non-interactive%20--headless%0A%20%20%20-%20If%20I%20already%20have%20a%20Zapier%20account%20and%20you%20are%20running%20on%20my%20machine%2C%20run%3A%20npx%20zapier-sdk%20login%20--non-interactive%0A%20%20%20-%20If%20unsure%2C%20ask%20whether%20to%20sign%20up%20or%20log%20in%2C%20and%20whether%20you%20are%20local%20or%20remote%2C%20before%20running%20any%20auth%20command.%0A%20%20%20-%20Use%20--headless%20when%20auth%20must%20happen%20through%20a%20browser%20outside%20this%20terminal.%20Show%20me%20the%20printed%20URL%20and%20pass%20the%20final%20OAuth%20callback%20URL%20back%20to%20the%20waiting%20command%20when%20I%20provide%20it.%0A%20%20%20-%20Browser%20signup%2Flogin%20opens%20a%20browser.%20A%20permissions%20or%20sandbox%20error%20usually%20means%20credentials%20could%20not%20be%20written%20to%20disk.%0A%20%20%20-%20If%20authentication%20fails%20for%20another%20reason%2C%20try%20once%20more.%0A%20%20%20-%20After%20authentication%20succeeds%2C%20confirm%20the%20email%20from%20the%20CLI%20output.%0A%0A8.%20List%20my%20connected%20apps%3A%20npx%20zapier-sdk%20list-connections%20--owner%20me%20--json%202%3E%2Fdev%2Fnull%20%7C%20head%20-n%201000%0A%20%20%20-%20Show%20only%20the%20first%2010%20results%20as%20a%20markdown%20table%20with%20columns%3A%20ID%2C%20App%20Key%2C%20Expired.%20Do%20not%20show%20Title.%0A%20%20%20-%20Tell%20me%20how%20many%20total%20connections%20there%20are.%20If%20there%20are%20more%20than%2010%2C%20say%20you%20are%20only%20showing%20the%20first%2010.%0A%20%20%20-%20The%20page%20size%20is%20100.%20If%20exactly%20100%20connections%20return%2C%20note%20that%20more%20may%20exist%2C%20but%20do%20not%20fetch%20more%20pages.%0A%20%20%20-%20If%20the%20list%20is%20empty%2C%20tell%20me%20to%20connect%20at%20least%20one%20app%20at%20https%3A%2F%2Fzapier.com%2Fapp%2Fassets%2Fconnections%20and%20come%20back.%0A%0A9.%20If%20this%20was%20an%20existing%20project%20from%20step%202%2C%20scan%20the%20codebase%20and%20suggest%202-3%20concrete%20ways%20to%20integrate%20the%20Zapier%20SDK.%20Reference%20real%20files%20and%20patterns%20you%20find%2C%20for%20example%20an%20API%20route%2C%20tool%20registry%2C%20backend%20service%2C%20or%20sync%20script.%20If%20this%20is%20a%20fresh%20project%2C%20skip%20this%20step.%0A%0AWhen%20setup%20is%20done%2C%20tell%20me%20I%20am%20ready%20and%20explain%3A%0A%0AZapier%20has%20pre-built%20connectors%20for%209%2C000%2B%20apps%2C%20including%20Slack%2C%20Google%20Sheets%2C%20Salesforce%2C%20GitHub%2C%20and%20thousands%20more.%20The%20SDK%20and%20CLI%20expose%20that%20integration%20layer%20to%20code%2C%20so%20you%20do%20not%20have%20to%20build%20OAuth%2C%20token%20refresh%2C%20retries%2C%20or%20each%20app%20API%20yourself.%20My%20existing%20Zapier%20connections%20are%20authenticated%20and%20ready%20to%20use.%0A%0A-%20**TypeScript%20SDK%3A**%20for%20production%20integrations%2C%20backend%20services%2C%20scheduled%20workflows%2C%20and%20agent%20tools.%20It%20is%20type-safe%2C%20handles%20token%20refresh%20and%20retries%2C%20and%20uses%20the%20same%20app%20keys%2C%20action%20keys%2C%20and%20input%20shapes%20discovered%20through%20the%20CLI.%20SDK%20reference%3A%20https%3A%2F%2Fdocs.zapier.com%2Fsdk%2Freference%0A-%20**CLI%3A**%20for%20exploration%20and%20ad-hoc%20actions.%20Use%20it%20to%20inspect%20apps%2C%20fields%2C%20and%20actions%2C%20then%20run%20one-offs%20from%20a%20terminal%20or%20agent.%20CLI%20reference%3A%20https%3A%2F%2Fdocs.zapier.com%2Fsdk%2Fcli-reference%0A%0A**Want%20to%20run%20a%20quick%20test%3F**%0A%0AIf%20I%20have%20a%20Slack%20connection%2C%20offer%20to%20send%20me%20a%20DM%20on%20Slack%20using%20the%20SDK.%20Describe%20what%20will%20happen%20and%20end%20with%3A%20%22Want%20to%20run%20this%20quick%20test%3F%22%20Then%20STOP%20and%20wait.%20Do%20not%20output%20anything%20else.%20If%20I%20do%20not%20have%20a%20Slack%20connection%2C%20skip%20the%20test.%0A%0AOnly%20proceed%20with%20the%20test%20if%20my%20reply%20is%20clearly%20affirmative%2C%20such%20as%20%22yes%22%20or%20%22go%20ahead%22.%20If%20ambiguous%2C%20skip%20the%20test%20and%20continue.%0A%0AWhen%20I%20say%20yes%2C%20create%20src%2Fzapier-slack-test.ts%20with%20code%20that%3A%0A%0A1.%20Looks%20up%20my%20Slack%20user%20by%20email%20using%20sdk.runAction(%22slack%22%2C%20%22search%22%2C%20%22user_by_email%22%2C%20%7B%20connectionId%3A%20ID%2C%20inputs%3A%20%7B%20email%3A%20%22ZAPIER_EMAIL%22%20%7D%20%7D).%0A2.%20Sends%20a%20DM%20to%20myself%20using%20sdk.runAction(%22slack%22%2C%20%22write%22%2C%20%22direct_message%22%2C%20%7B%20connectionId%3A%20ID%2C%20inputs%3A%20%7B%20channel%3A%20%22USERNAME%22%2C%20text%3A%20%22Hello%20via%20Zapier%20SDK%22%20%7D%20%7D).%0A%0AReplace%20ID%2C%20ZAPIER_EMAIL%2C%20and%20USERNAME%20with%20real%20values%20from%20earlier%20steps.%20Run%20it%20with%20npx%20tsx%20src%2Fzapier-slack-test.ts.%20If%20user_by_email%20fails%2C%20ask%20for%20my%20Slack%20email%20and%20try%20again.%0A%0AAfter%20the%20test%20completes%2C%20is%20skipped%2C%20or%20there%20is%20no%20Slack%20connection%3A%0A%0A-%20Pick%201-3%20apps%20from%20the%20connections%20table%20and%20show%20commands%20I%20can%20use%20to%20explore%20their%20actions%2C%20such%20as%3A%20npx%20zapier-sdk%20list-actions%20APP_KEY%0A-%20Do%20not%20run%20those%20commands.%0A-%20Suggest%203%20specific%20ideas%20based%20on%20my%20connected%20apps.%20Each%20idea%20should%20read%20from%20one%20app%2C%20optionally%20process%20data%2C%20and%20write%20to%20another.%20Do%20not%20suggest%20event-driven%20workflows.%20Keep%20each%20idea%20to%20one%20sentence.%20Example%3A%20%22pull%20in-progress%20Jira%20issues%20and%20DM%20yourself%20a%20summary%20on%20Slack%22." horizontal width="16" height="16" data-path="images/logos/branded/claude.svg" />

  <Card title="Open in Cursor" icon="https://mintcdn.com/zapier-82f0e938/rR3XBX59eJV84aG0/images/logos/branded/cursor.svg?fit=max&auto=format&n=rR3XBX59eJV84aG0&q=85&s=05cb7c79b1b7de2d4e43878e0add7190" href="cursor://anysphere.cursor-deeplink/prompt?text=Set%20up%20the%20Zapier%20SDK%20for%20me.%20Before%20installing%20anything%3A%0A%0A-%20Run%20%60pwd%60%20and%20tell%20me%20the%20current%20folder.%0A-%20Ask%20whether%20to%20install%20here%20or%20somewhere%20else.%0A%0AEnd%20with%3A%20%22Should%20I%20set%20up%20here%2C%20or%20do%20you%20want%20to%20point%20me%20at%20a%20different%20directory%3F%22%20Then%20STOP%20and%20wait.%20If%20I%20name%20a%20different%20directory%2C%20%60cd%60%20there%20first%2C%20creating%20it%20with%20%60mkdir%20-p%60%20if%20needed.%20If%20my%20reply%20is%20ambiguous%2C%20use%20the%20current%20directory.%0A%0AAfter%20I%20confirm%20the%20directory%2C%20work%20through%20these%20steps%20one%20at%20a%20time.%20Run%20each%20command%20in%20the%20terminal%2C%20report%20what%20happened%2C%20then%20continue.%0A%0A1.%20Detect%20the%20package%20manager.%0A%20%20%20Check%20for%20pnpm-lock.yaml%2C%20yarn.lock%2C%20bun.lockb%2C%20or%20package-lock.json.%20If%20one%20exists%2C%20use%20that%20manager%20for%20every%20install%20command.%20If%20none%20exist%2C%20use%20npm.%0A%0A2.%20Ensure%20a%20project%20exists.%0A%20%20%20-%20If%20package.json%20exists%2C%20use%20the%20project%20as-is%20and%20remember%20this%20for%20step%209.%0A%20%20%20-%20If%20package.json%20is%20missing%2C%20create%20one%3A%20npm%20init%20-y%0A%0A3.%20Check%20Node.js%20is%20installed%20at%20version%2020%20or%20higher%3A%20node%20-v%0A%20%20%20-%20If%20Node%20is%20missing%2C%20tell%20me%20to%20install%20it%20from%20https%3A%2F%2Fnodejs.org%20or%20run%20brew%20install%20node%2C%20then%20stop.%0A%20%20%20-%20If%20Node%20is%20older%20than%2020%2C%20tell%20me%20to%20upgrade%20it%2C%20then%20stop.%0A%0A4.%20Install%20the%20SDK%3A%20npm%20install%20%40zapier%2Fzapier-sdk%0A%20%20%20-%20An%20EPERM%20error%20on%20~%2F.npm%2F_cacache%20usually%20means%20the%20command%20sandbox%20is%20blocking%20npm%20cache%20writes%2C%20not%20that%20file%20permissions%20are%20broken.%0A%0A5.%20Install%20dev%20dependencies%3A%20npm%20install%20-D%20%40zapier%2Fzapier-sdk-cli%20%40types%2Fnode%20typescript%20tsx%0A%0A6.%20Ask%20whether%20to%20install%20the%20optional%20Zapier%20SDK%20skill%20for%20agent%20context.%0A%20%20%20Say%3A%20%22Do%20you%20want%20me%20to%20install%20the%20optional%20Zapier%20SDK%20skill%20for%20extra%20agent%20context%3F%20It%20is%20not%20required%20for%20SDK%20setup.%22%20Then%20STOP%20and%20wait.%0A%20%20%20-%20If%20I%20clearly%20say%20yes%2C%20run%3A%20npx%20skills%20add%20zapier%2Fsdk%20-y%0A%20%20%20-%20Otherwise%2C%20skip%20this%20step%20and%20continue.%0A%0A7.%20Authenticate%20with%20Zapier.%0A%20%20%20First%20ask%3A%20%22Are%20you%20signing%20up%20or%20logging%20in%3F%20Am%20I%20running%20on%20your%20local%20machine%20with%20a%20browser%2C%20or%20in%20a%20remote%2Fheadless%20environment%20like%20Telegram%20or%20Discord%3F%22%20Then%20STOP%20and%20wait.%20Do%20not%20infer%20the%20environment.%0A%20%20%20-%20If%20I%20do%20not%20have%20a%20Zapier%20account%20and%20we%20are%20in%20a%20remote%20environment%20like%20Telegram%20or%20Discord%2C%20run%3A%20npx%20zapier-sdk%20signup%20--non-interactive%20--headless%0A%20%20%20-%20If%20I%20do%20not%20have%20a%20Zapier%20account%20and%20you%20are%20running%20on%20my%20machine%2C%20run%3A%20npx%20zapier-sdk%20signup%20--non-interactive%0A%20%20%20-%20If%20I%20already%20have%20a%20Zapier%20account%20and%20we%20are%20in%20a%20remote%20environment%20like%20Telegram%20or%20Discord%2C%20run%3A%20npx%20zapier-sdk%20login%20--non-interactive%20--headless%0A%20%20%20-%20If%20I%20already%20have%20a%20Zapier%20account%20and%20you%20are%20running%20on%20my%20machine%2C%20run%3A%20npx%20zapier-sdk%20login%20--non-interactive%0A%20%20%20-%20If%20unsure%2C%20ask%20whether%20to%20sign%20up%20or%20log%20in%2C%20and%20whether%20you%20are%20local%20or%20remote%2C%20before%20running%20any%20auth%20command.%0A%20%20%20-%20Use%20--headless%20when%20auth%20must%20happen%20through%20a%20browser%20outside%20this%20terminal.%20Show%20me%20the%20printed%20URL%20and%20pass%20the%20final%20OAuth%20callback%20URL%20back%20to%20the%20waiting%20command%20when%20I%20provide%20it.%0A%20%20%20-%20Browser%20signup%2Flogin%20opens%20a%20browser.%20A%20permissions%20or%20sandbox%20error%20usually%20means%20credentials%20could%20not%20be%20written%20to%20disk.%0A%20%20%20-%20If%20authentication%20fails%20for%20another%20reason%2C%20try%20once%20more.%0A%20%20%20-%20After%20authentication%20succeeds%2C%20confirm%20the%20email%20from%20the%20CLI%20output.%0A%0A8.%20List%20my%20connected%20apps%3A%20npx%20zapier-sdk%20list-connections%20--owner%20me%20--json%202%3E%2Fdev%2Fnull%20%7C%20head%20-n%201000%0A%20%20%20-%20Show%20only%20the%20first%2010%20results%20as%20a%20markdown%20table%20with%20columns%3A%20ID%2C%20App%20Key%2C%20Expired.%20Do%20not%20show%20Title.%0A%20%20%20-%20Tell%20me%20how%20many%20total%20connections%20there%20are.%20If%20there%20are%20more%20than%2010%2C%20say%20you%20are%20only%20showing%20the%20first%2010.%0A%20%20%20-%20The%20page%20size%20is%20100.%20If%20exactly%20100%20connections%20return%2C%20note%20that%20more%20may%20exist%2C%20but%20do%20not%20fetch%20more%20pages.%0A%20%20%20-%20If%20the%20list%20is%20empty%2C%20tell%20me%20to%20connect%20at%20least%20one%20app%20at%20https%3A%2F%2Fzapier.com%2Fapp%2Fassets%2Fconnections%20and%20come%20back.%0A%0A9.%20If%20this%20was%20an%20existing%20project%20from%20step%202%2C%20scan%20the%20codebase%20and%20suggest%202-3%20concrete%20ways%20to%20integrate%20the%20Zapier%20SDK.%20Reference%20real%20files%20and%20patterns%20you%20find%2C%20for%20example%20an%20API%20route%2C%20tool%20registry%2C%20backend%20service%2C%20or%20sync%20script.%20If%20this%20is%20a%20fresh%20project%2C%20skip%20this%20step.%0A%0AWhen%20setup%20is%20done%2C%20tell%20me%20I%20am%20ready%20and%20explain%3A%0A%0AZapier%20has%20pre-built%20connectors%20for%209%2C000%2B%20apps%2C%20including%20Slack%2C%20Google%20Sheets%2C%20Salesforce%2C%20GitHub%2C%20and%20thousands%20more.%20The%20SDK%20and%20CLI%20expose%20that%20integration%20layer%20to%20code%2C%20so%20you%20do%20not%20have%20to%20build%20OAuth%2C%20token%20refresh%2C%20retries%2C%20or%20each%20app%20API%20yourself.%20My%20existing%20Zapier%20connections%20are%20authenticated%20and%20ready%20to%20use.%0A%0A-%20**TypeScript%20SDK%3A**%20for%20production%20integrations%2C%20backend%20services%2C%20scheduled%20workflows%2C%20and%20agent%20tools.%20It%20is%20type-safe%2C%20handles%20token%20refresh%20and%20retries%2C%20and%20uses%20the%20same%20app%20keys%2C%20action%20keys%2C%20and%20input%20shapes%20discovered%20through%20the%20CLI.%20SDK%20reference%3A%20https%3A%2F%2Fdocs.zapier.com%2Fsdk%2Freference%0A-%20**CLI%3A**%20for%20exploration%20and%20ad-hoc%20actions.%20Use%20it%20to%20inspect%20apps%2C%20fields%2C%20and%20actions%2C%20then%20run%20one-offs%20from%20a%20terminal%20or%20agent.%20CLI%20reference%3A%20https%3A%2F%2Fdocs.zapier.com%2Fsdk%2Fcli-reference%0A%0A**Want%20to%20run%20a%20quick%20test%3F**%0A%0AIf%20I%20have%20a%20Slack%20connection%2C%20offer%20to%20send%20me%20a%20DM%20on%20Slack%20using%20the%20SDK.%20Describe%20what%20will%20happen%20and%20end%20with%3A%20%22Want%20to%20run%20this%20quick%20test%3F%22%20Then%20STOP%20and%20wait.%20Do%20not%20output%20anything%20else.%20If%20I%20do%20not%20have%20a%20Slack%20connection%2C%20skip%20the%20test.%0A%0AOnly%20proceed%20with%20the%20test%20if%20my%20reply%20is%20clearly%20affirmative%2C%20such%20as%20%22yes%22%20or%20%22go%20ahead%22.%20If%20ambiguous%2C%20skip%20the%20test%20and%20continue.%0A%0AWhen%20I%20say%20yes%2C%20create%20src%2Fzapier-slack-test.ts%20with%20code%20that%3A%0A%0A1.%20Looks%20up%20my%20Slack%20user%20by%20email%20using%20sdk.runAction(%22slack%22%2C%20%22search%22%2C%20%22user_by_email%22%2C%20%7B%20connectionId%3A%20ID%2C%20inputs%3A%20%7B%20email%3A%20%22ZAPIER_EMAIL%22%20%7D%20%7D).%0A2.%20Sends%20a%20DM%20to%20myself%20using%20sdk.runAction(%22slack%22%2C%20%22write%22%2C%20%22direct_message%22%2C%20%7B%20connectionId%3A%20ID%2C%20inputs%3A%20%7B%20channel%3A%20%22USERNAME%22%2C%20text%3A%20%22Hello%20via%20Zapier%20SDK%22%20%7D%20%7D).%0A%0AReplace%20ID%2C%20ZAPIER_EMAIL%2C%20and%20USERNAME%20with%20real%20values%20from%20earlier%20steps.%20Run%20it%20with%20npx%20tsx%20src%2Fzapier-slack-test.ts.%20If%20user_by_email%20fails%2C%20ask%20for%20my%20Slack%20email%20and%20try%20again.%0A%0AAfter%20the%20test%20completes%2C%20is%20skipped%2C%20or%20there%20is%20no%20Slack%20connection%3A%0A%0A-%20Pick%201-3%20apps%20from%20the%20connections%20table%20and%20show%20commands%20I%20can%20use%20to%20explore%20their%20actions%2C%20such%20as%3A%20npx%20zapier-sdk%20list-actions%20APP_KEY%0A-%20Do%20not%20run%20those%20commands.%0A-%20Suggest%203%20specific%20ideas%20based%20on%20my%20connected%20apps.%20Each%20idea%20should%20read%20from%20one%20app%2C%20optionally%20process%20data%2C%20and%20write%20to%20another.%20Do%20not%20suggest%20event-driven%20workflows.%20Keep%20each%20idea%20to%20one%20sentence.%20Example%3A%20%22pull%20in-progress%20Jira%20issues%20and%20DM%20yourself%20a%20summary%20on%20Slack%22." horizontal width="16" height="16" data-path="images/logos/branded/cursor.svg" />

  <Card title="Open in VS Code Copilot" icon="https://mintcdn.com/zapier-82f0e938/rR3XBX59eJV84aG0/images/logos/branded/vs-code.svg?fit=max&auto=format&n=rR3XBX59eJV84aG0&q=85&s=47b212e58fcf15170d4f581a7b6b8d52" href="vscode://GitHub.copilot-chat/chat?prompt=Set%20up%20the%20Zapier%20SDK%20for%20me.%20Before%20installing%20anything%3A%0A%0A-%20Run%20%60pwd%60%20and%20tell%20me%20the%20current%20folder.%0A-%20Ask%20whether%20to%20install%20here%20or%20somewhere%20else.%0A%0AEnd%20with%3A%20%22Should%20I%20set%20up%20here%2C%20or%20do%20you%20want%20to%20point%20me%20at%20a%20different%20directory%3F%22%20Then%20STOP%20and%20wait.%20If%20I%20name%20a%20different%20directory%2C%20%60cd%60%20there%20first%2C%20creating%20it%20with%20%60mkdir%20-p%60%20if%20needed.%20If%20my%20reply%20is%20ambiguous%2C%20use%20the%20current%20directory.%0A%0AAfter%20I%20confirm%20the%20directory%2C%20work%20through%20these%20steps%20one%20at%20a%20time.%20Run%20each%20command%20in%20the%20terminal%2C%20report%20what%20happened%2C%20then%20continue.%0A%0A1.%20Detect%20the%20package%20manager.%0A%20%20%20Check%20for%20pnpm-lock.yaml%2C%20yarn.lock%2C%20bun.lockb%2C%20or%20package-lock.json.%20If%20one%20exists%2C%20use%20that%20manager%20for%20every%20install%20command.%20If%20none%20exist%2C%20use%20npm.%0A%0A2.%20Ensure%20a%20project%20exists.%0A%20%20%20-%20If%20package.json%20exists%2C%20use%20the%20project%20as-is%20and%20remember%20this%20for%20step%209.%0A%20%20%20-%20If%20package.json%20is%20missing%2C%20create%20one%3A%20npm%20init%20-y%0A%0A3.%20Check%20Node.js%20is%20installed%20at%20version%2020%20or%20higher%3A%20node%20-v%0A%20%20%20-%20If%20Node%20is%20missing%2C%20tell%20me%20to%20install%20it%20from%20https%3A%2F%2Fnodejs.org%20or%20run%20brew%20install%20node%2C%20then%20stop.%0A%20%20%20-%20If%20Node%20is%20older%20than%2020%2C%20tell%20me%20to%20upgrade%20it%2C%20then%20stop.%0A%0A4.%20Install%20the%20SDK%3A%20npm%20install%20%40zapier%2Fzapier-sdk%0A%20%20%20-%20An%20EPERM%20error%20on%20~%2F.npm%2F_cacache%20usually%20means%20the%20command%20sandbox%20is%20blocking%20npm%20cache%20writes%2C%20not%20that%20file%20permissions%20are%20broken.%0A%0A5.%20Install%20dev%20dependencies%3A%20npm%20install%20-D%20%40zapier%2Fzapier-sdk-cli%20%40types%2Fnode%20typescript%20tsx%0A%0A6.%20Ask%20whether%20to%20install%20the%20optional%20Zapier%20SDK%20skill%20for%20agent%20context.%0A%20%20%20Say%3A%20%22Do%20you%20want%20me%20to%20install%20the%20optional%20Zapier%20SDK%20skill%20for%20extra%20agent%20context%3F%20It%20is%20not%20required%20for%20SDK%20setup.%22%20Then%20STOP%20and%20wait.%0A%20%20%20-%20If%20I%20clearly%20say%20yes%2C%20run%3A%20npx%20skills%20add%20zapier%2Fsdk%20-y%0A%20%20%20-%20Otherwise%2C%20skip%20this%20step%20and%20continue.%0A%0A7.%20Authenticate%20with%20Zapier.%0A%20%20%20First%20ask%3A%20%22Are%20you%20signing%20up%20or%20logging%20in%3F%20Am%20I%20running%20on%20your%20local%20machine%20with%20a%20browser%2C%20or%20in%20a%20remote%2Fheadless%20environment%20like%20Telegram%20or%20Discord%3F%22%20Then%20STOP%20and%20wait.%20Do%20not%20infer%20the%20environment.%0A%20%20%20-%20If%20I%20do%20not%20have%20a%20Zapier%20account%20and%20we%20are%20in%20a%20remote%20environment%20like%20Telegram%20or%20Discord%2C%20run%3A%20npx%20zapier-sdk%20signup%20--non-interactive%20--headless%0A%20%20%20-%20If%20I%20do%20not%20have%20a%20Zapier%20account%20and%20you%20are%20running%20on%20my%20machine%2C%20run%3A%20npx%20zapier-sdk%20signup%20--non-interactive%0A%20%20%20-%20If%20I%20already%20have%20a%20Zapier%20account%20and%20we%20are%20in%20a%20remote%20environment%20like%20Telegram%20or%20Discord%2C%20run%3A%20npx%20zapier-sdk%20login%20--non-interactive%20--headless%0A%20%20%20-%20If%20I%20already%20have%20a%20Zapier%20account%20and%20you%20are%20running%20on%20my%20machine%2C%20run%3A%20npx%20zapier-sdk%20login%20--non-interactive%0A%20%20%20-%20If%20unsure%2C%20ask%20whether%20to%20sign%20up%20or%20log%20in%2C%20and%20whether%20you%20are%20local%20or%20remote%2C%20before%20running%20any%20auth%20command.%0A%20%20%20-%20Use%20--headless%20when%20auth%20must%20happen%20through%20a%20browser%20outside%20this%20terminal.%20Show%20me%20the%20printed%20URL%20and%20pass%20the%20final%20OAuth%20callback%20URL%20back%20to%20the%20waiting%20command%20when%20I%20provide%20it.%0A%20%20%20-%20Browser%20signup%2Flogin%20opens%20a%20browser.%20A%20permissions%20or%20sandbox%20error%20usually%20means%20credentials%20could%20not%20be%20written%20to%20disk.%0A%20%20%20-%20If%20authentication%20fails%20for%20another%20reason%2C%20try%20once%20more.%0A%20%20%20-%20After%20authentication%20succeeds%2C%20confirm%20the%20email%20from%20the%20CLI%20output.%0A%0A8.%20List%20my%20connected%20apps%3A%20npx%20zapier-sdk%20list-connections%20--owner%20me%20--json%202%3E%2Fdev%2Fnull%20%7C%20head%20-n%201000%0A%20%20%20-%20Show%20only%20the%20first%2010%20results%20as%20a%20markdown%20table%20with%20columns%3A%20ID%2C%20App%20Key%2C%20Expired.%20Do%20not%20show%20Title.%0A%20%20%20-%20Tell%20me%20how%20many%20total%20connections%20there%20are.%20If%20there%20are%20more%20than%2010%2C%20say%20you%20are%20only%20showing%20the%20first%2010.%0A%20%20%20-%20The%20page%20size%20is%20100.%20If%20exactly%20100%20connections%20return%2C%20note%20that%20more%20may%20exist%2C%20but%20do%20not%20fetch%20more%20pages.%0A%20%20%20-%20If%20the%20list%20is%20empty%2C%20tell%20me%20to%20connect%20at%20least%20one%20app%20at%20https%3A%2F%2Fzapier.com%2Fapp%2Fassets%2Fconnections%20and%20come%20back.%0A%0A9.%20If%20this%20was%20an%20existing%20project%20from%20step%202%2C%20scan%20the%20codebase%20and%20suggest%202-3%20concrete%20ways%20to%20integrate%20the%20Zapier%20SDK.%20Reference%20real%20files%20and%20patterns%20you%20find%2C%20for%20example%20an%20API%20route%2C%20tool%20registry%2C%20backend%20service%2C%20or%20sync%20script.%20If%20this%20is%20a%20fresh%20project%2C%20skip%20this%20step.%0A%0AWhen%20setup%20is%20done%2C%20tell%20me%20I%20am%20ready%20and%20explain%3A%0A%0AZapier%20has%20pre-built%20connectors%20for%209%2C000%2B%20apps%2C%20including%20Slack%2C%20Google%20Sheets%2C%20Salesforce%2C%20GitHub%2C%20and%20thousands%20more.%20The%20SDK%20and%20CLI%20expose%20that%20integration%20layer%20to%20code%2C%20so%20you%20do%20not%20have%20to%20build%20OAuth%2C%20token%20refresh%2C%20retries%2C%20or%20each%20app%20API%20yourself.%20My%20existing%20Zapier%20connections%20are%20authenticated%20and%20ready%20to%20use.%0A%0A-%20**TypeScript%20SDK%3A**%20for%20production%20integrations%2C%20backend%20services%2C%20scheduled%20workflows%2C%20and%20agent%20tools.%20It%20is%20type-safe%2C%20handles%20token%20refresh%20and%20retries%2C%20and%20uses%20the%20same%20app%20keys%2C%20action%20keys%2C%20and%20input%20shapes%20discovered%20through%20the%20CLI.%20SDK%20reference%3A%20https%3A%2F%2Fdocs.zapier.com%2Fsdk%2Freference%0A-%20**CLI%3A**%20for%20exploration%20and%20ad-hoc%20actions.%20Use%20it%20to%20inspect%20apps%2C%20fields%2C%20and%20actions%2C%20then%20run%20one-offs%20from%20a%20terminal%20or%20agent.%20CLI%20reference%3A%20https%3A%2F%2Fdocs.zapier.com%2Fsdk%2Fcli-reference%0A%0A**Want%20to%20run%20a%20quick%20test%3F**%0A%0AIf%20I%20have%20a%20Slack%20connection%2C%20offer%20to%20send%20me%20a%20DM%20on%20Slack%20using%20the%20SDK.%20Describe%20what%20will%20happen%20and%20end%20with%3A%20%22Want%20to%20run%20this%20quick%20test%3F%22%20Then%20STOP%20and%20wait.%20Do%20not%20output%20anything%20else.%20If%20I%20do%20not%20have%20a%20Slack%20connection%2C%20skip%20the%20test.%0A%0AOnly%20proceed%20with%20the%20test%20if%20my%20reply%20is%20clearly%20affirmative%2C%20such%20as%20%22yes%22%20or%20%22go%20ahead%22.%20If%20ambiguous%2C%20skip%20the%20test%20and%20continue.%0A%0AWhen%20I%20say%20yes%2C%20create%20src%2Fzapier-slack-test.ts%20with%20code%20that%3A%0A%0A1.%20Looks%20up%20my%20Slack%20user%20by%20email%20using%20sdk.runAction(%22slack%22%2C%20%22search%22%2C%20%22user_by_email%22%2C%20%7B%20connectionId%3A%20ID%2C%20inputs%3A%20%7B%20email%3A%20%22ZAPIER_EMAIL%22%20%7D%20%7D).%0A2.%20Sends%20a%20DM%20to%20myself%20using%20sdk.runAction(%22slack%22%2C%20%22write%22%2C%20%22direct_message%22%2C%20%7B%20connectionId%3A%20ID%2C%20inputs%3A%20%7B%20channel%3A%20%22USERNAME%22%2C%20text%3A%20%22Hello%20via%20Zapier%20SDK%22%20%7D%20%7D).%0A%0AReplace%20ID%2C%20ZAPIER_EMAIL%2C%20and%20USERNAME%20with%20real%20values%20from%20earlier%20steps.%20Run%20it%20with%20npx%20tsx%20src%2Fzapier-slack-test.ts.%20If%20user_by_email%20fails%2C%20ask%20for%20my%20Slack%20email%20and%20try%20again.%0A%0AAfter%20the%20test%20completes%2C%20is%20skipped%2C%20or%20there%20is%20no%20Slack%20connection%3A%0A%0A-%20Pick%201-3%20apps%20from%20the%20connections%20table%20and%20show%20commands%20I%20can%20use%20to%20explore%20their%20actions%2C%20such%20as%3A%20npx%20zapier-sdk%20list-actions%20APP_KEY%0A-%20Do%20not%20run%20those%20commands.%0A-%20Suggest%203%20specific%20ideas%20based%20on%20my%20connected%20apps.%20Each%20idea%20should%20read%20from%20one%20app%2C%20optionally%20process%20data%2C%20and%20write%20to%20another.%20Do%20not%20suggest%20event-driven%20workflows.%20Keep%20each%20idea%20to%20one%20sentence.%20Example%3A%20%22pull%20in-progress%20Jira%20issues%20and%20DM%20yourself%20a%20summary%20on%20Slack%22." horizontal width="16" height="16" data-path="images/logos/branded/vs-code.svg" />
</CardGroup>

**Your agent walks you through the process**

<CardGroup cols={2}>
  <Card title="Open in ChatGPT" icon="https://mintcdn.com/zapier-82f0e938/rR3XBX59eJV84aG0/images/logos/branded/openai.svg?fit=max&auto=format&n=rR3XBX59eJV84aG0&q=85&s=b8031fcd753c6c37e0528a300f79513d" href="https://chatgpt.com/?q=I%20want%20to%20build%20with%20the%20Zapier%20SDK.%20Read%20https%3A%2F%2Fdocs.zapier.com%2Fsdk%2Fquickstart.md%20and%20walk%20me%20through%20the%20setup%20step%20by%20step" horizontal width="16" height="16" data-path="images/logos/branded/openai.svg" />

  <Card title="Open in Claude" icon="https://mintcdn.com/zapier-82f0e938/rR3XBX59eJV84aG0/images/logos/branded/claude.svg?fit=max&auto=format&n=rR3XBX59eJV84aG0&q=85&s=9f0b8f48afbdf67c84f41b94925bdfe4" href="https://claude.ai/new?q=I%20want%20to%20build%20with%20the%20Zapier%20SDK.%20Read%20https%3A%2F%2Fdocs.zapier.com%2Fsdk%2Fquickstart.md%20and%20walk%20me%20through%20the%20setup%20step%20by%20step" horizontal width="16" height="16" data-path="images/logos/branded/claude.svg" />

  <Card title="Open in Perplexity" icon="https://mintcdn.com/zapier-82f0e938/rR3XBX59eJV84aG0/images/logos/branded/perplexity.svg?fit=max&auto=format&n=rR3XBX59eJV84aG0&q=85&s=4aae0451a68506f51f10ef9d8167b818" href="https://www.perplexity.ai/search?q=I%20want%20to%20build%20with%20the%20Zapier%20SDK.%20Read%20https%3A%2F%2Fdocs.zapier.com%2Fsdk%2Fquickstart.md%20and%20walk%20me%20through%20the%20setup%20step%20by%20step" horizontal width="28" height="36" data-path="images/logos/branded/perplexity.svg" />
</CardGroup>

Using another IDE agent (Cline, Windsurf, etc.)? Copy this prompt.

<div data-track-target="sdk_setup_prompt" data-track-label="SDK setup prompt" data-track-interaction="copy_prompt_click" data-track-goal="copy_prompt" data-track-trigger="button[data-testid='copy-code-button']">
  ```text expandable theme={null}
  Set up the Zapier SDK for me. Before installing anything:

  - Run `pwd` and tell me the current folder.
  - Ask whether to install here or somewhere else.

  End with: "Should I set up here, or do you want to point me at a different directory?" Then STOP and wait. If I name a different directory, `cd` there first, creating it with `mkdir -p` if needed. If my reply is ambiguous, use the current directory.

  After I confirm the directory, work through these steps one at a time. Run each command in the terminal, report what happened, then continue.

  1. Detect the package manager.
     Check for pnpm-lock.yaml, yarn.lock, bun.lockb, or package-lock.json. If one exists, use that manager for every install command. If none exist, use npm.

  2. Ensure a project exists.
     - If package.json exists, use the project as-is and remember this for step 9.
     - If package.json is missing, create one: npm init -y

  3. Check Node.js is installed at version 20 or higher: node -v
     - If Node is missing, tell me to install it from https://nodejs.org or run brew install node, then stop.
     - If Node is older than 20, tell me to upgrade it, then stop.

  4. Install the SDK: npm install @zapier/zapier-sdk
     - An EPERM error on ~/.npm/_cacache usually means the command sandbox is blocking npm cache writes, not that file permissions are broken.

  5. Install dev dependencies: npm install -D @zapier/zapier-sdk-cli @types/node typescript tsx

  6. Ask whether to install the optional Zapier SDK skill for agent context.
     Say: "Do you want me to install the optional Zapier SDK skill for extra agent context? It is not required for SDK setup." Then STOP and wait.
     - If I clearly say yes, run: npx skills add zapier/sdk -y
     - Otherwise, skip this step and continue.

  7. Authenticate with Zapier.
     First ask: "Are you signing up or logging in? Am I running on your local machine with a browser, or in a remote/headless environment like Telegram or Discord?" Then STOP and wait. Do not infer the environment.
     - If I do not have a Zapier account and we are in a remote environment like Telegram or Discord, run: npx zapier-sdk signup --non-interactive --headless
     - If I do not have a Zapier account and you are running on my machine, run: npx zapier-sdk signup --non-interactive
     - If I already have a Zapier account and we are in a remote environment like Telegram or Discord, run: npx zapier-sdk login --non-interactive --headless
     - If I already have a Zapier account and you are running on my machine, run: npx zapier-sdk login --non-interactive
     - If unsure, ask whether to sign up or log in, and whether you are local or remote, before running any auth command.
     - Use --headless when auth must happen through a browser outside this terminal. Show me the printed URL and pass the final OAuth callback URL back to the waiting command when I provide it.
     - Browser signup/login opens a browser. A permissions or sandbox error usually means credentials could not be written to disk.
     - If authentication fails for another reason, try once more.
     - After authentication succeeds, confirm the email from the CLI output.

  8. List my connected apps: npx zapier-sdk list-connections --owner me --json 2>/dev/null | head -n 1000
     - Show only the first 10 results as a markdown table with columns: ID, App Key, Expired. Do not show Title.
     - Tell me how many total connections there are. If there are more than 10, say you are only showing the first 10.
     - The page size is 100. If exactly 100 connections return, note that more may exist, but do not fetch more pages.
     - If the list is empty, tell me to connect at least one app at https://zapier.com/app/assets/connections and come back.

  9. If this was an existing project from step 2, scan the codebase and suggest 2-3 concrete ways to integrate the Zapier SDK. Reference real files and patterns you find, for example an API route, tool registry, backend service, or sync script. If this is a fresh project, skip this step.

  When setup is done, tell me I am ready and explain:

  Zapier has pre-built connectors for 9,000+ apps, including Slack, Google Sheets, Salesforce, GitHub, and thousands more. The SDK and CLI expose that integration layer to code, so you do not have to build OAuth, token refresh, retries, or each app API yourself. My existing Zapier connections are authenticated and ready to use.

  - **TypeScript SDK:** for production integrations, backend services, scheduled workflows, and agent tools. It is type-safe, handles token refresh and retries, and uses the same app keys, action keys, and input shapes discovered through the CLI. SDK reference: https://docs.zapier.com/sdk/reference
  - **CLI:** for exploration and ad-hoc actions. Use it to inspect apps, fields, and actions, then run one-offs from a terminal or agent. CLI reference: https://docs.zapier.com/sdk/cli-reference

  **Want to run a quick test?**

  If I have a Slack connection, offer to send me a DM on Slack using the SDK. Describe what will happen and end with: "Want to run this quick test?" Then STOP and wait. Do not output anything else. If I do not have a Slack connection, skip the test.

  Only proceed with the test if my reply is clearly affirmative, such as "yes" or "go ahead". If ambiguous, skip the test and continue.

  When I say yes, create src/zapier-slack-test.ts with code that:

  1. Looks up my Slack user by email using sdk.runAction("slack", "search", "user_by_email", { connectionId: ID, inputs: { email: "ZAPIER_EMAIL" } }).
  2. Sends a DM to myself using sdk.runAction("slack", "write", "direct_message", { connectionId: ID, inputs: { channel: "USERNAME", text: "Hello via Zapier SDK" } }).

  Replace ID, ZAPIER_EMAIL, and USERNAME with real values from earlier steps. Run it with npx tsx src/zapier-slack-test.ts. If user_by_email fails, ask for my Slack email and try again.

  After the test completes, is skipped, or there is no Slack connection:

  - Pick 1-3 apps from the connections table and show commands I can use to explore their actions, such as: npx zapier-sdk list-actions APP_KEY
  - Do not run those commands.
  - Suggest 3 specific ideas based on my connected apps. Each idea should read from one app, optionally process data, and write to another. Do not suggest event-driven workflows. Keep each idea to one sentence. Example: "pull in-progress Jira issues and DM yourself a summary on Slack".
  ```
</div>

Or [follow the manual quickstart guide](/sdk/quickstart#prerequisites) to set up step by step.

### What Can You Build?

### Example Use Case: Reschedule a meeting and notify attendees

Your user says: *"Move my 2pm meeting to Thursday and let the attendees know."*

Your agent finds the meeting in Google Calendar, reschedules it, and messages each attendee in Slack - all via the SDK:

```typescript theme={null}
import { createZapierSdk } from "@zapier/zapier-sdk";

const zapier = createZapierSdk();

// Bind the user's connected accounts
const { data: calConnection } = await zapier.findFirstConnection({
  appKey: "google-calendar",
  owner: "me",
  isExpired: false,
});
const { data: slackConnection } = await zapier.findFirstConnection({
  appKey: "slack",
  owner: "me",
  isExpired: false,
});

const calendar = zapier.apps.google_calendar({
  connectionId: calConnection.id,
});
const slack = zapier.apps.slack({ connectionId: slackConnection.id });

// Find a specific meeting
const { data: events } = await calendar.search.event_v2({
  inputs: {
    calendarid: "Calendar ID",
    search_term: "Meeting Title",
  },
});
const meeting = events[0] as {
  id: string;
  summary: string;
  attendees: { email: string }[];
};

// Move it to Thursday
await calendar.write.update_event({
  inputs: {
    calendarid: "Calendar ID",
    eventid: meeting.id,
    start__dateTime: "2026-02-19T12:00:00-00:00",
    end__dateTime: "2026-02-19T12:30:00-00:00",
  },
});

// Look up Slack user IDs for all attendees
const slackUsers = await Promise.all(
  meeting.attendees.map((attendee) =>
    slack.search.user_by_email({ inputs: { email: attendee.email } }),
  ),
);

// Notify each attendee via Slack DM
for (const { data } of slackUsers) {
  const user = data[0] as { id: string };
  await slack.write.direct_message({
    inputs: {
      channel: user.id,
      text: `Our "${meeting.summary}" meeting has been moved to Thursday at 12pm.`,
    },
  });
}
```

## **What's happening under the hood:**

* **`findFirstConnection`** retrieves the user's connected Google Calendar and Slack accounts — no OAuth flows to build
* **`apps.google_calendar(...)`** binds your connect once, so every subsequent call uses those credentials
* **`search`**, **`write`**, and **`read`** map to the type of action: find data, create/update data, or list data
* The SDK handles token refresh, retries, and API differences across apps — your agent just calls actions

## Feedback

<Tip>
  **Going beyond local development?** You'll need [client credentials](/sdk/deploy)
  to run the SDK on a server, in CI, or on a cloud platform.
</Tip>

<Note>
  **We want your feedback.** The SDK is still taking shape and your input drives
  what we build next. Hit a bug? Missing a feature? Have an idea? [Tell us about
  it](https://npsup.zapier.app/contact-us?product=Zapier%20SDK)
</Note>
