> ## 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.

# Quickstart

> Get up and running with the Zapier SDK in 5 minutes

export const appCount = "9,000+";

## Set up with your AI

**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>

***

## Prerequisites

* Node.js 20+ installed
* A [Zapier account](https://zapier.com/sign-up) (free tier works). Or create one using the CLI in Step 3
* At least one app connected to your Zapier account

## Step 1: Install the SDK

Create a new project (or use an existing one) and install the required packages:

```bash theme={null}
# Create a new project (optional)
mkdir my-zapier-project && cd my-zapier-project
npm init -y && npm pkg set type=module

# Install the SDK and CLI
npm install @zapier/zapier-sdk
npm install -D @zapier/zapier-sdk-cli @types/node typescript

# Initialize TypeScript (if starting fresh)
npx tsc --init
```

<Tip>
  The examples in this guide assume you have `"type": "module"` in your
  `package.json` so that you're using ES modules with support for top-level
  `await`. We do that above with `npm pkg set type=module`.
</Tip>

## Step 2: Install the SDK skill

Install the Zapier SDK skill so your coding agent knows how to use the SDK across every future session:

```bash theme={null}
npx skills add zapier/sdk -y
```

Works with Claude Code, Cursor, Codex, OpenCode, Windsurf, and 50+ other coding agents.

## Step 3: Authenticate

The SDK CLI can create a Zapier account or log into an existing one, then
provision local SDK credentials:

New to Zapier? Start with `signup`:

```bash theme={null}
npx zapier-sdk signup
```

This opens your browser to create an account, authorize the SDK CLI, and store a
local SDK credential.

Already have a Zapier account? Use `login` instead:

```bash theme={null}
npx zapier-sdk login
```

As long as the CLI package is installed as a development dependency, the SDK will automatically use your CLI authentication.

<Warning>
  **Building for production or deploying to a server?** CLI authentication is
  for development terminals. For any server-side deployment, [client
  credentials](/sdk/deploy) are the recommended approach.
</Warning>

<Info>
  **Want approvals on these credentials?** Pass `--use-approvals` to `signup`
  or `login` to provision the credential with an empty permission policy. Every
  request will prompt you to approve (or deny) the action until you've built the
  policy up. See [Permissions](/sdk/permissions) for the full flow.

  ```bash theme={null}
  npx zapier-sdk signup --use-approvals
  # or, if you already have an account:
  npx zapier-sdk login --use-approvals
  ```
</Info>

<AccordionGroup>
  <Accordion title="Alternative: Headless authentication">
    Use headless authentication when your terminal cannot open a browser, like
    an SSH session or remote dev box. The CLI prints a signup or login URL; open
    it somewhere with a browser, finish authentication, then paste the final
    callback URL back into the terminal.

    ```bash theme={null}
    npx zapier-sdk signup --headless
    # or, if you already have an account:
    npx zapier-sdk login --headless
    ```

    If an agent is running the command and should never stop for prompts,
    combine it with `--non-interactive`:

    ```bash theme={null}
    npx zapier-sdk signup --non-interactive --headless
    # or, if you already have an account:
    npx zapier-sdk login --non-interactive --headless
    ```
  </Accordion>

  <Accordion title="Alternative: Client Credentials">
    The [client credentials guide](/sdk/deploy) covers creation, secure storage, and how to use them across platforms.

    ```typescript theme={null}
    const zapier = createZapierSdk({
      credentials: {
        clientId: process.env.ZAPIER_CREDENTIALS_CLIENT_ID,
        clientSecret: process.env.ZAPIER_CREDENTIALS_CLIENT_SECRET,
      },
    });
    ```
  </Accordion>

  <Accordion title="Alternative: Direct Token">
    You can also provide a token directly:

    ```typescript theme={null}
    const zapier = createZapierSdk({
      credentials: process.env.ZAPIER_CREDENTIALS,
    });
    ```
  </Accordion>
</AccordionGroup>

## Step 4: Generate Types for Your Apps

The SDK can generate TypeScript types for any app, giving you full autocomplete and type safety:

```bash theme={null}
# Add types for the apps you want to use
npx zapier-sdk add slack google-sheets

# Don't know the app key? Search for it
npx zapier-sdk list-apps --search "google sheets"
```

Types are generated in your `src` or `lib` folder by default. You can customize the output location:

```bash theme={null}
npx zapier-sdk add slack --types-output ./types
```

## Step 5: Initialize the SDK

Create a new file (e.g., `index.ts`) and initialize the SDK:

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

// Initialize with browser-based auth (from `zapier-sdk signup` or `zapier-sdk login`).
const zapier = createZapierSdk();
```

## Step 6: List Your Connected Apps

Let's verify everything works by listing available apps:

```typescript theme={null}

// List the first page of apps
const { data: apps } = await zapier.listApps();

console.log(
  "Available apps:",
  apps.map((app) => app.title)
);
```

<Tip>
  This returns the first page of results. For large datasets, use `.items()` to
  iterate over all results or `maxItems` to limit the total. See the [API
  Reference](/sdk/reference) for pagination patterns.
</Tip>

Run your script:

```bash theme={null}
npx tsx index.ts
```

## Step 7: Run Your First Action

Now let's execute an action. First, you'll need a connection for the app you want to use:

```typescript theme={null}

// Get Slack connection

// Option 1: Use listConnections when you need to filter or 
// work with multiple connections.
const { data: allSlackConnections } = await zapier.listConnections({
  appKey: "slack",
  owner: "me",
  isExpired: false,
});

const acmeSlackConnection = allSlackConnections.find(c => c?.title?.toLowerCase().includes("acme"))
if (!acmeSlackConnection) {
  console.log(
    "Slack connection matching filter not found. Connect Slack at https://zapier.com/app/assets/connections"
  );
}

// Option 2: Use findFirstConnection when you just need the first 
// available connection and let any errors bubble up
const { data: firstSlackConnection } = await zapier.findFirstConnection({
  appKey: "slack",
  owner: "me",
});

// List Slack channels using your connection
const { data: channels } = await zapier.runAction({
  appKey: "slack",
  actionType: "read",
  actionKey: "channels",
  connectionId: firstSlackConnection.id,
});

console.log("Your Slack channels:", channels);
```

## Step 8: Use the Proxy Pattern (Optional)

For a cleaner syntax, use the app proxy pattern:

```typescript theme={null}

const { data: firstSlackConnection } = await zapier.findFirstConnection({
  appKey: "slack",
  owner: "me",
  isExpired: false,
});

// Create a bound Slack instance
const mySlack = zapier.apps.slack({
  connectionId: firstSlackConnection.id,
});

// Now use it with a clean syntax
const { data: channels } = await mySlack.read.channels({});

console.log("Channels:", channels);

// Or pass auth inline without binding
const { data: users } = await zapier.apps.slack.search.user_by_email({
  inputs: { email: "colleague@company.com" },
  connectionId: firstSlackConnection.id,
});
```

## Step 9: Make Custom API Calls with `fetch` (Optional)

<Info>
  **Note on governance:** The `.fetch()` method makes authenticated API calls
  directly, giving you access to any supported endpoint. Unlike pre-built
  actions, these direct API calls are not currently subject to your org's app or
  action restriction policies. If your org has governance requirements, use
  pre-built actions where possible. Direct API governance is on the roadmap.
</Info>

When you need to call an API that doesn't have a built-in action, use `fetch` to make authenticated requests through the Zapier SDK:

```typescript theme={null}

// Get your Slack connection
const { data: slackConnection } = await zapier.findFirstConnection({
  appKey: "slack",
  owner: "me",
  isExpired: false,
});

if (!slackConnection) {
  console.log(
    "No Slack connection found. Connect Slack at https://zapier.com/app/assets/connections"
  );
  process.exit(1);
}

// Make a custom API call—Zapier injects the user's credentials
const response = await zapier.fetch("https://slack.com/api/users.list", {
  method: "GET",
  connectionId: slackConnection.id,
});

const users = await response.json();
```

## Complete Example

Here's a full example that sends a Slack message:

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

async function main() {
  const zapier = createZapierSdk();

  // Get Slack connection
  const { data: firstSlackConnection } = await zapier.findFirstConnection({
    appKey: "slack",
    owner: "me",
    isExpired: false,
  });

  // Create bound Slack instance
  const slack = zapier.apps.slack({
    connectionId: firstSlackConnection.id,
  });

  // Get available channels
  const { data: channels } = (await slack.read.channels({})) as {
    data: Array<{ id: string; name: string }>;
  };
  const testChannel = channels.find((c) => c.name === "testing");

  if (!testChannel) {
    throw new Error("Could not find #testing channel");
  }

  // Send a message
  const { data: result } = await slack.write.channel_message({
    inputs: {
      channel: testChannel.id,
      text: "Hello from the Zapier SDK!",
    },
  });

  console.log("Message sent!", result);
}

main().catch(console.error);
```

## Next Steps

* [API Reference](/sdk/reference) — full documentation of all SDK methods and patterns
* [CLI Reference](/sdk/cli-reference) — command-line tools including list-apps, add, and view-policy
* [Browse integrations](https://zapier.com/apps) — {appCount} apps you can connect
* [Try the demo use case](/sdk) — the meeting reschedule example on the overview page is a confirmed working end-to-end scenario, good for testing your setup
* [Hit a problem?](https://npsup.zapier.app/contact-us?product=Zapier%20SDK) — tell us what broke via the feedback form
