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

This guide walks you through installing the SDK, authenticating, and running your first action.

## Set up with your AI

**Your agent runs the commands for you**

<CardGroup cols={4}>
  <Card title="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%20%20-%20Tell%20me%20what%20folder%20we're%20currently%20in%20(run%20%60pwd%60%20and%20report%20the%20path).%0A%20%20-%20Ask%20me%20whether%20to%20install%20here%20or%20in%20a%20different%20directory.%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%20for%20my%20reply%20before%20continuing.%20If%20I%20name%20a%20different%20directory%2C%20%60cd%60%20to%20it%20(creating%20it%20with%20%60mkdir%20-p%60%20if%20it%20doesn't%20exist)%20before%20going%20further.%20If%20my%20reply%20is%20ambiguous%2C%20default%20to%20the%20current%20directory.%0A%0AOnce%20I've%20confirmed%20the%20directory%2C%20work%20through%20these%20steps%20one%20at%20a%20time%2C%20running%20each%20command%20in%20the%20terminal%20and%20telling%20me%20what%20happened%20before%20moving%20on%3A%0A%0A1.%20Check%20whether%20a%20package.json%20exists%20in%20this%20folder.%0A%20%20%20-%20If%20there's%20already%20a%20package.json%2C%20use%20this%20project%20as-is.%0A%20%20%20-%20If%20there's%20no%20package.json%2C%20create%20one%3A%20npm%20init%20-y%0A%0A2.%20Check%20Node.js%20is%20installed%20and%20is%20version%2020%20or%20higher%3A%20node%20-v%0A%20%20%20-%20If%20Node%20is%20not%20found%3A%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%3A%20tell%20me%20to%20upgrade%20it%2C%20then%20stop.%0A%0A3.%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's%20cache%20writes%2C%20not%20a%20file%20permissions%20issue.%0A%0A4.%20Install%20dev%20dependencies%3A%20npm%20install%20-D%20%40zapier%2Fzapier-sdk-cli%20%40types%2Fnode%20typescript%0A%0A5.%20Install%20the%20Zapier%20SDK%20skill%3A%20npx%20skills%20add%20zapier%2Fsdk%20-y%0A%0A6.%20Log%20in%20to%20Zapier%3A%20npx%20zapier-sdk%20login%0A%20%20%20-%20This%20opens%20a%20browser%20window.%20A%20permissions%20or%20sandbox%20error%20here%20typically%20means%20the%20command%20sandbox%20is%20preventing%20credentials%20from%20being%20written%20to%20disk.%0A%20%20%20-%20If%20login%20fails%20for%20another%20reason%2C%20try%20again.%0A%0A7.%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-%20Read%20the%20output%20and%20show%20only%20the%20first%2010%20results%20as%20a%20markdown%20table%20with%20columns%3A%20ID%2C%20App%20Key%2C%20Expired.%20Do%20not%20show%20Title.%20Always%20tell%20me%20how%20many%20total%20connections%20there%20are%2C%20and%20if%20there%20are%20more%20than%2010%2C%20note%20that%20you%20are%20only%20showing%20the%20first%2010.%0A%20%20%20-%20The%20page%20size%20is%20100.%20If%20the%20output%20contains%20exactly%20100%20connections%2C%20there%20may%20be%20additional%20connections%20beyond%20this%20first%20page.%20Just%20note%20that%20and%20move%20on%20%E2%80%94%20do%20not%20fetch%20additional%20pages.%0A%20%20%20-%20If%20the%20list%20is%20empty%3A%20tell%20me%20to%20connect%20at%20least%20one%20app%20at%20https%3A%2F%2Fzapier.com%2Fapp%2Fassets%2Fconnections%20and%20come%20back.%0A%0AOnce%20all%20steps%20are%20done%2C%20tell%20me%20I%20am%20ready%20and%20explain%3A%0A%0AZapier%20has%20pre-built%20connectors%20for%208%2C000%2B%20apps%20%E2%80%94%20Slack%2C%20Google%20Sheets%2C%20Salesforce%2C%20GitHub%2C%20and%20thousands%20more.%20The%20Zapier%20SDK%20and%20CLI%20expose%20that%20same%20integration%20layer%20to%20code.%20Instead%20of%20building%20OAuth%20flows%2C%20handling%20token%20refresh%2C%20and%20reverse-engineering%20each%20app's%20API%20yourself%2C%20you%20get%20a%20single%20consistent%20interface%20that%20already%20knows%20how%20to%20talk%20to%20all%20of%20them.%20Your%20users'%20existing%20Zapier%20connections%20are%20authenticated%20and%20ready%20to%20use.%0A%0A-%20**CLI%20%E2%80%94%20explore%2C%20run%20one-offs%2C%20or%20let%20an%20agent%20act%3A**%20the%20CLI%20is%20for%20exploration%20and%20ad-hoc%20action.%20Use%20it%20to%20see%20what%20an%20app%20can%20do%2C%20inspect%20the%20exact%20inputs%20an%20action%20expects%2C%20and%20run%20actions%20interactively%20%E2%80%94%20whether%20that's%20you%20in%20a%20terminal%20or%20an%20agent%20executing%20a%20task%20on%20demand.%20See%20the%20CLI%20reference%3A%20https%3A%2F%2Fdocs.zapier.com%2Fsdk%2Fcli-reference%0A-%20**TypeScript%20SDK%20%E2%80%94%20build%20production%20integrations%20and%20agent%20tools%3A**%20the%20SDK%20is%20for%20shipping.%20Use%20it%20when%20you%20need%20something%20repeatable%2C%20embedded%2C%20or%20in%20production%20%E2%80%94%20a%20scheduled%20workflow%2C%20a%20backend%20service%2C%20a%20tool%20inside%20an%20AI%20agent.%20It's%20type-safe%2C%20handles%20token%20refresh%20and%20retries%20automatically%2C%20and%20uses%20the%20same%20app%20keys%2C%20action%20keys%2C%20and%20input%20shapes%20you%20already%20discovered%20via%20the%20CLI.%20See%20the%20SDK%20reference%3A%20https%3A%2F%2Fdocs.zapier.com%2Fsdk%2Freference%0A%0A**Want%20to%20run%20a%20quick%20test%3F**%0A%0AIf%20I%20have%20a%20Slack%20connection%2C%20offer%20to%20send%20a%20DM%20to%20yourself%20on%20Slack.%20Describe%20the%20steps%20that%20will%20happen%20and%20end%20with%3A%20%22Want%20to%20run%20this%20quick%20test%3F%22%20Then%20STOP.%20Do%20not%20output%20anything%20else.%20Do%20not%20continue%20to%20the%20next%20section.%20Wait%20for%20my%20reply%20before%20proceeding.%0A%0AWhen%20I%20reply%20to%20the%20quick%20test%2C%20only%20proceed%20if%20my%20response%20is%20a%20clear%2C%20unambiguous%20affirmative%20(e.g.%20%22yes%22%2C%20%22go%20ahead%22).%20If%20ambiguous%20or%20unclear%2C%20skip%20the%20test%20and%20continue.%0A%0AIf%20I%20don't%20have%20a%20Slack%20connection%2C%20skip%20the%20test%20and%20continue.%0A%0A---%0A%0AWhen%20I%20reply%20yes%20to%20the%20quick%20test%2C%20run%20these%20exact%20commands%20in%20order%3A%0A%0A1.%20Look%20up%20my%20Slack%20username%3A%0A%20%20%20npx%20zapier-sdk%20run-action%20slack%20search%20user_by_email%20--connection-id%20ID%20--inputs%20'%7B%22email%22%3A%22ZAPIER_EMAIL%22%7D'%0A%0A2.%20Send%20a%20direct%20message%20to%20yourself%20using%20the%20username%20from%20step%201%3A%0A%20%20%20npx%20zapier-sdk%20run-action%20slack%20write%20direct_message%20--connection-id%20ID%20--inputs%20'%7B%22channel%22%3A%22USERNAME%22%2C%22text%22%3A%22Hello%20via%20Zapier%20SDK%20%F0%9F%91%8B%22%7D'%0A%0AReplace%20ID%20with%20my%20Slack%20connection%20ID%20from%20the%20table%20above.%20Replace%20ZAPIER_EMAIL%20with%20my%20Zapier%20login%20email.%20Replace%20USERNAME%20with%20the%20username%20returned%20from%20step%201.%0A%0AIf%20user_by_email%20fails%2C%20ask%20me%20for%20my%20Slack%20email%20and%20try%20again.%0A%0A---%0A%0AAfter%20the%20test%20completes%20(or%20if%20I%20skip%20it%2C%20or%20if%20there's%20no%20Slack%20connection)%3A%0A%0APick%201%E2%80%933%20apps%20from%20the%20connections%20table%20and%20show%20me%20the%20commands%20I%20could%20use%20to%20explore%20what%20actions%20they%20support.%20Do%20not%20run%20these%20commands%20%E2%80%94%20just%20display%20them%20so%20I%20can%20try%20on%20my%20own.%20For%20example%3A%0A%20%20%20npx%20zapier-sdk%20list-actions%20APP_KEY%0A%0A**All%20set!%20Now%2C%20a%20few%20ideas%20to%20start%20exploring%20what%20the%20Zapier%20SDK%20can%20do%3A**%0A%0ASuggest%203%20ideas%20worth%20exploring%20%E2%80%94%20good%20starting%20points%20based%20on%20my%20connected%20apps.%20Each%20idea%20reads%20from%20one%20app%2C%20optionally%20processes%20it%2C%20and%20writes%20to%20another.%20Do%20not%20suggest%20anything%20event-driven.%20Keep%20each%20idea%20to%20one%20sentence.%20Examples%3A%20%22get%20all%20your%20Jira%20issues%20still%20In%20Progress%20and%20DM%20yourself%20a%20tidy%20table%20on%20Slack%22%3B%20%22pull%20every%20HubSpot%20deal%20that%20closed%20this%20week%20and%20drop%20it%20into%20a%20Google%20Sheet%22.%20Make%20the%20ideas%20specific%20to%20my%20connected%20apps%20%E2%80%94%20not%20generic." horizontal width="16" height="16" data-path="images/logos/branded/openai.svg" />

  <Card title="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%20%20-%20Tell%20me%20what%20folder%20we're%20currently%20in%20(run%20%60pwd%60%20and%20report%20the%20path).%0A%20%20-%20Ask%20me%20whether%20to%20install%20here%20or%20in%20a%20different%20directory.%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%20for%20my%20reply%20before%20continuing.%20If%20I%20name%20a%20different%20directory%2C%20%60cd%60%20to%20it%20(creating%20it%20with%20%60mkdir%20-p%60%20if%20it%20doesn't%20exist)%20before%20going%20further.%20If%20my%20reply%20is%20ambiguous%2C%20default%20to%20the%20current%20directory.%0A%0AOnce%20I've%20confirmed%20the%20directory%2C%20work%20through%20these%20steps%20one%20at%20a%20time%2C%20running%20each%20command%20in%20the%20terminal%20and%20telling%20me%20what%20happened%20before%20moving%20on%3A%0A%0A1.%20Check%20whether%20a%20package.json%20exists%20in%20this%20folder.%0A%20%20%20-%20If%20there's%20already%20a%20package.json%2C%20use%20this%20project%20as-is.%0A%20%20%20-%20If%20there's%20no%20package.json%2C%20create%20one%3A%20npm%20init%20-y%0A%0A2.%20Check%20Node.js%20is%20installed%20and%20is%20version%2020%20or%20higher%3A%20node%20-v%0A%20%20%20-%20If%20Node%20is%20not%20found%3A%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%3A%20tell%20me%20to%20upgrade%20it%2C%20then%20stop.%0A%0A3.%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's%20cache%20writes%2C%20not%20a%20file%20permissions%20issue.%0A%0A4.%20Install%20dev%20dependencies%3A%20npm%20install%20-D%20%40zapier%2Fzapier-sdk-cli%20%40types%2Fnode%20typescript%0A%0A5.%20Install%20the%20Zapier%20SDK%20skill%3A%20npx%20skills%20add%20zapier%2Fsdk%20-y%0A%0A6.%20Log%20in%20to%20Zapier%3A%20npx%20zapier-sdk%20login%0A%20%20%20-%20This%20opens%20a%20browser%20window.%20A%20permissions%20or%20sandbox%20error%20here%20typically%20means%20the%20command%20sandbox%20is%20preventing%20credentials%20from%20being%20written%20to%20disk.%0A%20%20%20-%20If%20login%20fails%20for%20another%20reason%2C%20try%20again.%0A%0A7.%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-%20Read%20the%20output%20and%20show%20only%20the%20first%2010%20results%20as%20a%20markdown%20table%20with%20columns%3A%20ID%2C%20App%20Key%2C%20Expired.%20Do%20not%20show%20Title.%20Always%20tell%20me%20how%20many%20total%20connections%20there%20are%2C%20and%20if%20there%20are%20more%20than%2010%2C%20note%20that%20you%20are%20only%20showing%20the%20first%2010.%0A%20%20%20-%20The%20page%20size%20is%20100.%20If%20the%20output%20contains%20exactly%20100%20connections%2C%20there%20may%20be%20additional%20connections%20beyond%20this%20first%20page.%20Just%20note%20that%20and%20move%20on%20%E2%80%94%20do%20not%20fetch%20additional%20pages.%0A%20%20%20-%20If%20the%20list%20is%20empty%3A%20tell%20me%20to%20connect%20at%20least%20one%20app%20at%20https%3A%2F%2Fzapier.com%2Fapp%2Fassets%2Fconnections%20and%20come%20back.%0A%0AOnce%20all%20steps%20are%20done%2C%20tell%20me%20I%20am%20ready%20and%20explain%3A%0A%0AZapier%20has%20pre-built%20connectors%20for%208%2C000%2B%20apps%20%E2%80%94%20Slack%2C%20Google%20Sheets%2C%20Salesforce%2C%20GitHub%2C%20and%20thousands%20more.%20The%20Zapier%20SDK%20and%20CLI%20expose%20that%20same%20integration%20layer%20to%20code.%20Instead%20of%20building%20OAuth%20flows%2C%20handling%20token%20refresh%2C%20and%20reverse-engineering%20each%20app's%20API%20yourself%2C%20you%20get%20a%20single%20consistent%20interface%20that%20already%20knows%20how%20to%20talk%20to%20all%20of%20them.%20Your%20users'%20existing%20Zapier%20connections%20are%20authenticated%20and%20ready%20to%20use.%0A%0A-%20**CLI%20%E2%80%94%20explore%2C%20run%20one-offs%2C%20or%20let%20an%20agent%20act%3A**%20the%20CLI%20is%20for%20exploration%20and%20ad-hoc%20action.%20Use%20it%20to%20see%20what%20an%20app%20can%20do%2C%20inspect%20the%20exact%20inputs%20an%20action%20expects%2C%20and%20run%20actions%20interactively%20%E2%80%94%20whether%20that's%20you%20in%20a%20terminal%20or%20an%20agent%20executing%20a%20task%20on%20demand.%20See%20the%20CLI%20reference%3A%20https%3A%2F%2Fdocs.zapier.com%2Fsdk%2Fcli-reference%0A-%20**TypeScript%20SDK%20%E2%80%94%20build%20production%20integrations%20and%20agent%20tools%3A**%20the%20SDK%20is%20for%20shipping.%20Use%20it%20when%20you%20need%20something%20repeatable%2C%20embedded%2C%20or%20in%20production%20%E2%80%94%20a%20scheduled%20workflow%2C%20a%20backend%20service%2C%20a%20tool%20inside%20an%20AI%20agent.%20It's%20type-safe%2C%20handles%20token%20refresh%20and%20retries%20automatically%2C%20and%20uses%20the%20same%20app%20keys%2C%20action%20keys%2C%20and%20input%20shapes%20you%20already%20discovered%20via%20the%20CLI.%20See%20the%20SDK%20reference%3A%20https%3A%2F%2Fdocs.zapier.com%2Fsdk%2Freference%0A%0A**Want%20to%20run%20a%20quick%20test%3F**%0A%0AIf%20I%20have%20a%20Slack%20connection%2C%20offer%20to%20send%20a%20DM%20to%20yourself%20on%20Slack.%20Describe%20the%20steps%20that%20will%20happen%20and%20end%20with%3A%20%22Want%20to%20run%20this%20quick%20test%3F%22%20Then%20STOP.%20Do%20not%20output%20anything%20else.%20Do%20not%20continue%20to%20the%20next%20section.%20Wait%20for%20my%20reply%20before%20proceeding.%0A%0AWhen%20I%20reply%20to%20the%20quick%20test%2C%20only%20proceed%20if%20my%20response%20is%20a%20clear%2C%20unambiguous%20affirmative%20(e.g.%20%22yes%22%2C%20%22go%20ahead%22).%20If%20ambiguous%20or%20unclear%2C%20skip%20the%20test%20and%20continue.%0A%0AIf%20I%20don't%20have%20a%20Slack%20connection%2C%20skip%20the%20test%20and%20continue.%0A%0A---%0A%0AWhen%20I%20reply%20yes%20to%20the%20quick%20test%2C%20run%20these%20exact%20commands%20in%20order%3A%0A%0A1.%20Look%20up%20my%20Slack%20username%3A%0A%20%20%20npx%20zapier-sdk%20run-action%20slack%20search%20user_by_email%20--connection-id%20ID%20--inputs%20'%7B%22email%22%3A%22ZAPIER_EMAIL%22%7D'%0A%0A2.%20Send%20a%20direct%20message%20to%20yourself%20using%20the%20username%20from%20step%201%3A%0A%20%20%20npx%20zapier-sdk%20run-action%20slack%20write%20direct_message%20--connection-id%20ID%20--inputs%20'%7B%22channel%22%3A%22USERNAME%22%2C%22text%22%3A%22Hello%20via%20Zapier%20SDK%20%F0%9F%91%8B%22%7D'%0A%0AReplace%20ID%20with%20my%20Slack%20connection%20ID%20from%20the%20table%20above.%20Replace%20ZAPIER_EMAIL%20with%20my%20Zapier%20login%20email.%20Replace%20USERNAME%20with%20the%20username%20returned%20from%20step%201.%0A%0AIf%20user_by_email%20fails%2C%20ask%20me%20for%20my%20Slack%20email%20and%20try%20again.%0A%0A---%0A%0AAfter%20the%20test%20completes%20(or%20if%20I%20skip%20it%2C%20or%20if%20there's%20no%20Slack%20connection)%3A%0A%0APick%201%E2%80%933%20apps%20from%20the%20connections%20table%20and%20show%20me%20the%20commands%20I%20could%20use%20to%20explore%20what%20actions%20they%20support.%20Do%20not%20run%20these%20commands%20%E2%80%94%20just%20display%20them%20so%20I%20can%20try%20on%20my%20own.%20For%20example%3A%0A%20%20%20npx%20zapier-sdk%20list-actions%20APP_KEY%0A%0A**All%20set!%20Now%2C%20a%20few%20ideas%20to%20start%20exploring%20what%20the%20Zapier%20SDK%20can%20do%3A**%0A%0ASuggest%203%20ideas%20worth%20exploring%20%E2%80%94%20good%20starting%20points%20based%20on%20my%20connected%20apps.%20Each%20idea%20reads%20from%20one%20app%2C%20optionally%20processes%20it%2C%20and%20writes%20to%20another.%20Do%20not%20suggest%20anything%20event-driven.%20Keep%20each%20idea%20to%20one%20sentence.%20Examples%3A%20%22get%20all%20your%20Jira%20issues%20still%20In%20Progress%20and%20DM%20yourself%20a%20tidy%20table%20on%20Slack%22%3B%20%22pull%20every%20HubSpot%20deal%20that%20closed%20this%20week%20and%20drop%20it%20into%20a%20Google%20Sheet%22.%20Make%20the%20ideas%20specific%20to%20my%20connected%20apps%20%E2%80%94%20not%20generic." horizontal width="16" height="16" data-path="images/logos/branded/claude.svg" />

  <Card title="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%20%20-%20Tell%20me%20what%20folder%20we're%20currently%20in%20(run%20%60pwd%60%20and%20report%20the%20path).%0A%20%20-%20Ask%20me%20whether%20to%20install%20here%20or%20in%20a%20different%20directory.%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%20for%20my%20reply%20before%20continuing.%20If%20I%20name%20a%20different%20directory%2C%20%60cd%60%20to%20it%20(creating%20it%20with%20%60mkdir%20-p%60%20if%20it%20doesn't%20exist)%20before%20going%20further.%20If%20my%20reply%20is%20ambiguous%2C%20default%20to%20the%20current%20directory.%0A%0AOnce%20I've%20confirmed%20the%20directory%2C%20work%20through%20these%20steps%20one%20at%20a%20time%2C%20running%20each%20command%20in%20the%20terminal%20and%20telling%20me%20what%20happened%20before%20moving%20on%3A%0A%0A1.%20Check%20whether%20a%20package.json%20exists%20in%20this%20folder.%0A%20%20%20-%20If%20there's%20already%20a%20package.json%2C%20use%20this%20project%20as-is.%0A%20%20%20-%20If%20there's%20no%20package.json%2C%20create%20one%3A%20npm%20init%20-y%0A%0A2.%20Check%20Node.js%20is%20installed%20and%20is%20version%2020%20or%20higher%3A%20node%20-v%0A%20%20%20-%20If%20Node%20is%20not%20found%3A%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%3A%20tell%20me%20to%20upgrade%20it%2C%20then%20stop.%0A%0A3.%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's%20cache%20writes%2C%20not%20a%20file%20permissions%20issue.%0A%0A4.%20Install%20dev%20dependencies%3A%20npm%20install%20-D%20%40zapier%2Fzapier-sdk-cli%20%40types%2Fnode%20typescript%0A%0A5.%20Install%20the%20Zapier%20SDK%20skill%3A%20npx%20skills%20add%20zapier%2Fsdk%20-y%0A%0A6.%20Log%20in%20to%20Zapier%3A%20npx%20zapier-sdk%20login%0A%20%20%20-%20This%20opens%20a%20browser%20window.%20A%20permissions%20or%20sandbox%20error%20here%20typically%20means%20the%20command%20sandbox%20is%20preventing%20credentials%20from%20being%20written%20to%20disk.%0A%20%20%20-%20If%20login%20fails%20for%20another%20reason%2C%20try%20again.%0A%0A7.%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-%20Read%20the%20output%20and%20show%20only%20the%20first%2010%20results%20as%20a%20markdown%20table%20with%20columns%3A%20ID%2C%20App%20Key%2C%20Expired.%20Do%20not%20show%20Title.%20Always%20tell%20me%20how%20many%20total%20connections%20there%20are%2C%20and%20if%20there%20are%20more%20than%2010%2C%20note%20that%20you%20are%20only%20showing%20the%20first%2010.%0A%20%20%20-%20The%20page%20size%20is%20100.%20If%20the%20output%20contains%20exactly%20100%20connections%2C%20there%20may%20be%20additional%20connections%20beyond%20this%20first%20page.%20Just%20note%20that%20and%20move%20on%20%E2%80%94%20do%20not%20fetch%20additional%20pages.%0A%20%20%20-%20If%20the%20list%20is%20empty%3A%20tell%20me%20to%20connect%20at%20least%20one%20app%20at%20https%3A%2F%2Fzapier.com%2Fapp%2Fassets%2Fconnections%20and%20come%20back.%0A%0AOnce%20all%20steps%20are%20done%2C%20tell%20me%20I%20am%20ready%20and%20explain%3A%0A%0AZapier%20has%20pre-built%20connectors%20for%208%2C000%2B%20apps%20%E2%80%94%20Slack%2C%20Google%20Sheets%2C%20Salesforce%2C%20GitHub%2C%20and%20thousands%20more.%20The%20Zapier%20SDK%20and%20CLI%20expose%20that%20same%20integration%20layer%20to%20code.%20Instead%20of%20building%20OAuth%20flows%2C%20handling%20token%20refresh%2C%20and%20reverse-engineering%20each%20app's%20API%20yourself%2C%20you%20get%20a%20single%20consistent%20interface%20that%20already%20knows%20how%20to%20talk%20to%20all%20of%20them.%20Your%20users'%20existing%20Zapier%20connections%20are%20authenticated%20and%20ready%20to%20use.%0A%0A-%20**CLI%20%E2%80%94%20explore%2C%20run%20one-offs%2C%20or%20let%20an%20agent%20act%3A**%20the%20CLI%20is%20for%20exploration%20and%20ad-hoc%20action.%20Use%20it%20to%20see%20what%20an%20app%20can%20do%2C%20inspect%20the%20exact%20inputs%20an%20action%20expects%2C%20and%20run%20actions%20interactively%20%E2%80%94%20whether%20that's%20you%20in%20a%20terminal%20or%20an%20agent%20executing%20a%20task%20on%20demand.%20See%20the%20CLI%20reference%3A%20https%3A%2F%2Fdocs.zapier.com%2Fsdk%2Fcli-reference%0A-%20**TypeScript%20SDK%20%E2%80%94%20build%20production%20integrations%20and%20agent%20tools%3A**%20the%20SDK%20is%20for%20shipping.%20Use%20it%20when%20you%20need%20something%20repeatable%2C%20embedded%2C%20or%20in%20production%20%E2%80%94%20a%20scheduled%20workflow%2C%20a%20backend%20service%2C%20a%20tool%20inside%20an%20AI%20agent.%20It's%20type-safe%2C%20handles%20token%20refresh%20and%20retries%20automatically%2C%20and%20uses%20the%20same%20app%20keys%2C%20action%20keys%2C%20and%20input%20shapes%20you%20already%20discovered%20via%20the%20CLI.%20See%20the%20SDK%20reference%3A%20https%3A%2F%2Fdocs.zapier.com%2Fsdk%2Freference%0A%0A**Want%20to%20run%20a%20quick%20test%3F**%0A%0AIf%20I%20have%20a%20Slack%20connection%2C%20offer%20to%20send%20a%20DM%20to%20yourself%20on%20Slack.%20Describe%20the%20steps%20that%20will%20happen%20and%20end%20with%3A%20%22Want%20to%20run%20this%20quick%20test%3F%22%20Then%20STOP.%20Do%20not%20output%20anything%20else.%20Do%20not%20continue%20to%20the%20next%20section.%20Wait%20for%20my%20reply%20before%20proceeding.%0A%0AWhen%20I%20reply%20to%20the%20quick%20test%2C%20only%20proceed%20if%20my%20response%20is%20a%20clear%2C%20unambiguous%20affirmative%20(e.g.%20%22yes%22%2C%20%22go%20ahead%22).%20If%20ambiguous%20or%20unclear%2C%20skip%20the%20test%20and%20continue.%0A%0AIf%20I%20don't%20have%20a%20Slack%20connection%2C%20skip%20the%20test%20and%20continue.%0A%0A---%0A%0AWhen%20I%20reply%20yes%20to%20the%20quick%20test%2C%20run%20these%20exact%20commands%20in%20order%3A%0A%0A1.%20Look%20up%20my%20Slack%20username%3A%0A%20%20%20npx%20zapier-sdk%20run-action%20slack%20search%20user_by_email%20--connection-id%20ID%20--inputs%20'%7B%22email%22%3A%22ZAPIER_EMAIL%22%7D'%0A%0A2.%20Send%20a%20direct%20message%20to%20yourself%20using%20the%20username%20from%20step%201%3A%0A%20%20%20npx%20zapier-sdk%20run-action%20slack%20write%20direct_message%20--connection-id%20ID%20--inputs%20'%7B%22channel%22%3A%22USERNAME%22%2C%22text%22%3A%22Hello%20via%20Zapier%20SDK%20%F0%9F%91%8B%22%7D'%0A%0AReplace%20ID%20with%20my%20Slack%20connection%20ID%20from%20the%20table%20above.%20Replace%20ZAPIER_EMAIL%20with%20my%20Zapier%20login%20email.%20Replace%20USERNAME%20with%20the%20username%20returned%20from%20step%201.%0A%0AIf%20user_by_email%20fails%2C%20ask%20me%20for%20my%20Slack%20email%20and%20try%20again.%0A%0A---%0A%0AAfter%20the%20test%20completes%20(or%20if%20I%20skip%20it%2C%20or%20if%20there's%20no%20Slack%20connection)%3A%0A%0APick%201%E2%80%933%20apps%20from%20the%20connections%20table%20and%20show%20me%20the%20commands%20I%20could%20use%20to%20explore%20what%20actions%20they%20support.%20Do%20not%20run%20these%20commands%20%E2%80%94%20just%20display%20them%20so%20I%20can%20try%20on%20my%20own.%20For%20example%3A%0A%20%20%20npx%20zapier-sdk%20list-actions%20APP_KEY%0A%0A**All%20set!%20Now%2C%20a%20few%20ideas%20to%20start%20exploring%20what%20the%20Zapier%20SDK%20can%20do%3A**%0A%0ASuggest%203%20ideas%20worth%20exploring%20%E2%80%94%20good%20starting%20points%20based%20on%20my%20connected%20apps.%20Each%20idea%20reads%20from%20one%20app%2C%20optionally%20processes%20it%2C%20and%20writes%20to%20another.%20Do%20not%20suggest%20anything%20event-driven.%20Keep%20each%20idea%20to%20one%20sentence.%20Examples%3A%20%22get%20all%20your%20Jira%20issues%20still%20In%20Progress%20and%20DM%20yourself%20a%20tidy%20table%20on%20Slack%22%3B%20%22pull%20every%20HubSpot%20deal%20that%20closed%20this%20week%20and%20drop%20it%20into%20a%20Google%20Sheet%22.%20Make%20the%20ideas%20specific%20to%20my%20connected%20apps%20%E2%80%94%20not%20generic." horizontal width="16" height="16" data-path="images/logos/branded/cursor.svg" />

  <Card title="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%20%20-%20Tell%20me%20what%20folder%20we're%20currently%20in%20(run%20%60pwd%60%20and%20report%20the%20path).%0A%20%20-%20Ask%20me%20whether%20to%20install%20here%20or%20in%20a%20different%20directory.%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%20for%20my%20reply%20before%20continuing.%20If%20I%20name%20a%20different%20directory%2C%20%60cd%60%20to%20it%20(creating%20it%20with%20%60mkdir%20-p%60%20if%20it%20doesn't%20exist)%20before%20going%20further.%20If%20my%20reply%20is%20ambiguous%2C%20default%20to%20the%20current%20directory.%0A%0AOnce%20I've%20confirmed%20the%20directory%2C%20work%20through%20these%20steps%20one%20at%20a%20time%2C%20running%20each%20command%20in%20the%20terminal%20and%20telling%20me%20what%20happened%20before%20moving%20on%3A%0A%0A1.%20Check%20whether%20a%20package.json%20exists%20in%20this%20folder.%0A%20%20%20-%20If%20there's%20already%20a%20package.json%2C%20use%20this%20project%20as-is.%0A%20%20%20-%20If%20there's%20no%20package.json%2C%20create%20one%3A%20npm%20init%20-y%0A%0A2.%20Check%20Node.js%20is%20installed%20and%20is%20version%2020%20or%20higher%3A%20node%20-v%0A%20%20%20-%20If%20Node%20is%20not%20found%3A%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%3A%20tell%20me%20to%20upgrade%20it%2C%20then%20stop.%0A%0A3.%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's%20cache%20writes%2C%20not%20a%20file%20permissions%20issue.%0A%0A4.%20Install%20dev%20dependencies%3A%20npm%20install%20-D%20%40zapier%2Fzapier-sdk-cli%20%40types%2Fnode%20typescript%0A%0A5.%20Install%20the%20Zapier%20SDK%20skill%3A%20npx%20skills%20add%20zapier%2Fsdk%20-y%0A%0A6.%20Log%20in%20to%20Zapier%3A%20npx%20zapier-sdk%20login%0A%20%20%20-%20This%20opens%20a%20browser%20window.%20A%20permissions%20or%20sandbox%20error%20here%20typically%20means%20the%20command%20sandbox%20is%20preventing%20credentials%20from%20being%20written%20to%20disk.%0A%20%20%20-%20If%20login%20fails%20for%20another%20reason%2C%20try%20again.%0A%0A7.%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-%20Read%20the%20output%20and%20show%20only%20the%20first%2010%20results%20as%20a%20markdown%20table%20with%20columns%3A%20ID%2C%20App%20Key%2C%20Expired.%20Do%20not%20show%20Title.%20Always%20tell%20me%20how%20many%20total%20connections%20there%20are%2C%20and%20if%20there%20are%20more%20than%2010%2C%20note%20that%20you%20are%20only%20showing%20the%20first%2010.%0A%20%20%20-%20The%20page%20size%20is%20100.%20If%20the%20output%20contains%20exactly%20100%20connections%2C%20there%20may%20be%20additional%20connections%20beyond%20this%20first%20page.%20Just%20note%20that%20and%20move%20on%20%E2%80%94%20do%20not%20fetch%20additional%20pages.%0A%20%20%20-%20If%20the%20list%20is%20empty%3A%20tell%20me%20to%20connect%20at%20least%20one%20app%20at%20https%3A%2F%2Fzapier.com%2Fapp%2Fassets%2Fconnections%20and%20come%20back.%0A%0AOnce%20all%20steps%20are%20done%2C%20tell%20me%20I%20am%20ready%20and%20explain%3A%0A%0AZapier%20has%20pre-built%20connectors%20for%208%2C000%2B%20apps%20%E2%80%94%20Slack%2C%20Google%20Sheets%2C%20Salesforce%2C%20GitHub%2C%20and%20thousands%20more.%20The%20Zapier%20SDK%20and%20CLI%20expose%20that%20same%20integration%20layer%20to%20code.%20Instead%20of%20building%20OAuth%20flows%2C%20handling%20token%20refresh%2C%20and%20reverse-engineering%20each%20app's%20API%20yourself%2C%20you%20get%20a%20single%20consistent%20interface%20that%20already%20knows%20how%20to%20talk%20to%20all%20of%20them.%20Your%20users'%20existing%20Zapier%20connections%20are%20authenticated%20and%20ready%20to%20use.%0A%0A-%20**CLI%20%E2%80%94%20explore%2C%20run%20one-offs%2C%20or%20let%20an%20agent%20act%3A**%20the%20CLI%20is%20for%20exploration%20and%20ad-hoc%20action.%20Use%20it%20to%20see%20what%20an%20app%20can%20do%2C%20inspect%20the%20exact%20inputs%20an%20action%20expects%2C%20and%20run%20actions%20interactively%20%E2%80%94%20whether%20that's%20you%20in%20a%20terminal%20or%20an%20agent%20executing%20a%20task%20on%20demand.%20See%20the%20CLI%20reference%3A%20https%3A%2F%2Fdocs.zapier.com%2Fsdk%2Fcli-reference%0A-%20**TypeScript%20SDK%20%E2%80%94%20build%20production%20integrations%20and%20agent%20tools%3A**%20the%20SDK%20is%20for%20shipping.%20Use%20it%20when%20you%20need%20something%20repeatable%2C%20embedded%2C%20or%20in%20production%20%E2%80%94%20a%20scheduled%20workflow%2C%20a%20backend%20service%2C%20a%20tool%20inside%20an%20AI%20agent.%20It's%20type-safe%2C%20handles%20token%20refresh%20and%20retries%20automatically%2C%20and%20uses%20the%20same%20app%20keys%2C%20action%20keys%2C%20and%20input%20shapes%20you%20already%20discovered%20via%20the%20CLI.%20See%20the%20SDK%20reference%3A%20https%3A%2F%2Fdocs.zapier.com%2Fsdk%2Freference%0A%0A**Want%20to%20run%20a%20quick%20test%3F**%0A%0AIf%20I%20have%20a%20Slack%20connection%2C%20offer%20to%20send%20a%20DM%20to%20yourself%20on%20Slack.%20Describe%20the%20steps%20that%20will%20happen%20and%20end%20with%3A%20%22Want%20to%20run%20this%20quick%20test%3F%22%20Then%20STOP.%20Do%20not%20output%20anything%20else.%20Do%20not%20continue%20to%20the%20next%20section.%20Wait%20for%20my%20reply%20before%20proceeding.%0A%0AWhen%20I%20reply%20to%20the%20quick%20test%2C%20only%20proceed%20if%20my%20response%20is%20a%20clear%2C%20unambiguous%20affirmative%20(e.g.%20%22yes%22%2C%20%22go%20ahead%22).%20If%20ambiguous%20or%20unclear%2C%20skip%20the%20test%20and%20continue.%0A%0AIf%20I%20don't%20have%20a%20Slack%20connection%2C%20skip%20the%20test%20and%20continue.%0A%0A---%0A%0AWhen%20I%20reply%20yes%20to%20the%20quick%20test%2C%20run%20these%20exact%20commands%20in%20order%3A%0A%0A1.%20Look%20up%20my%20Slack%20username%3A%0A%20%20%20npx%20zapier-sdk%20run-action%20slack%20search%20user_by_email%20--connection-id%20ID%20--inputs%20'%7B%22email%22%3A%22ZAPIER_EMAIL%22%7D'%0A%0A2.%20Send%20a%20direct%20message%20to%20yourself%20using%20the%20username%20from%20step%201%3A%0A%20%20%20npx%20zapier-sdk%20run-action%20slack%20write%20direct_message%20--connection-id%20ID%20--inputs%20'%7B%22channel%22%3A%22USERNAME%22%2C%22text%22%3A%22Hello%20via%20Zapier%20SDK%20%F0%9F%91%8B%22%7D'%0A%0AReplace%20ID%20with%20my%20Slack%20connection%20ID%20from%20the%20table%20above.%20Replace%20ZAPIER_EMAIL%20with%20my%20Zapier%20login%20email.%20Replace%20USERNAME%20with%20the%20username%20returned%20from%20step%201.%0A%0AIf%20user_by_email%20fails%2C%20ask%20me%20for%20my%20Slack%20email%20and%20try%20again.%0A%0A---%0A%0AAfter%20the%20test%20completes%20(or%20if%20I%20skip%20it%2C%20or%20if%20there's%20no%20Slack%20connection)%3A%0A%0APick%201%E2%80%933%20apps%20from%20the%20connections%20table%20and%20show%20me%20the%20commands%20I%20could%20use%20to%20explore%20what%20actions%20they%20support.%20Do%20not%20run%20these%20commands%20%E2%80%94%20just%20display%20them%20so%20I%20can%20try%20on%20my%20own.%20For%20example%3A%0A%20%20%20npx%20zapier-sdk%20list-actions%20APP_KEY%0A%0A**All%20set!%20Now%2C%20a%20few%20ideas%20to%20start%20exploring%20what%20the%20Zapier%20SDK%20can%20do%3A**%0A%0ASuggest%203%20ideas%20worth%20exploring%20%E2%80%94%20good%20starting%20points%20based%20on%20my%20connected%20apps.%20Each%20idea%20reads%20from%20one%20app%2C%20optionally%20processes%20it%2C%20and%20writes%20to%20another.%20Do%20not%20suggest%20anything%20event-driven.%20Keep%20each%20idea%20to%20one%20sentence.%20Examples%3A%20%22get%20all%20your%20Jira%20issues%20still%20In%20Progress%20and%20DM%20yourself%20a%20tidy%20table%20on%20Slack%22%3B%20%22pull%20every%20HubSpot%20deal%20that%20closed%20this%20week%20and%20drop%20it%20into%20a%20Google%20Sheet%22.%20Make%20the%20ideas%20specific%20to%20my%20connected%20apps%20%E2%80%94%20not%20generic." horizontal width="16" height="16" data-path="images/logos/branded/vs-code.svg" />
</CardGroup>

**Your agent walks you through the process**

<CardGroup cols={3}>
  <Card title="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="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="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.

```text expandable theme={null}
Set up the Zapier SDK for me. Before installing anything:

  - Tell me what folder we're currently in (run `pwd` and report the path).
  - Ask me whether to install here or in a different directory.

End with: "Should I set up here, or do you want to point me at a different directory?" Then STOP and wait for my reply before continuing. If I name a different directory, `cd` to it (creating it with `mkdir -p` if it doesn't exist) before going further. If my reply is ambiguous, default to the current directory.

Once I've confirmed the directory, work through these steps one at a time, running each command in the terminal and telling me what happened before moving on:

1. Check whether a package.json exists in this folder.
   - If there's already a package.json, use this project as-is.
   - If there's no package.json, create one: npm init -y

2. Check Node.js is installed and is version 20 or higher: node -v
   - If Node is not found: 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.

3. Install the SDK: npm install @zapier/zapier-sdk
   - An EPERM error on ~/.npm/_cacache usually means the command sandbox is blocking npm's cache writes, not a file permissions issue.

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

5. Install the Zapier SDK skill: npx skills add zapier/sdk -y

6. Log in to Zapier: npx zapier-sdk login
   - This opens a browser window. A permissions or sandbox error here typically means the command sandbox is preventing credentials from being written to disk.
   - If login fails for another reason, try again.

7. List my connected apps: npx zapier-sdk list-connections --owner me --json 2>/dev/null | head -n 1000
   - Read the output and show only the first 10 results as a markdown table with columns: ID, App Key, Expired. Do not show Title. Always tell me how many total connections there are, and if there are more than 10, note that you are only showing the first 10.
   - The page size is 100. If the output contains exactly 100 connections, there may be additional connections beyond this first page. Just note that and move on — do not fetch additional pages.
   - If the list is empty: tell me to connect at least one app at https://zapier.com/app/assets/connections and come back.

Once all steps are done, tell me I am ready and explain:

Zapier has pre-built connectors for 8,000+ apps — Slack, Google Sheets, Salesforce, GitHub, and thousands more. The Zapier SDK and CLI expose that same integration layer to code. Instead of building OAuth flows, handling token refresh, and reverse-engineering each app's API yourself, you get a single consistent interface that already knows how to talk to all of them. Your users' existing Zapier connections are authenticated and ready to use.

- **CLI — explore, run one-offs, or let an agent act:** the CLI is for exploration and ad-hoc action. Use it to see what an app can do, inspect the exact inputs an action expects, and run actions interactively — whether that's you in a terminal or an agent executing a task on demand. See the CLI reference: https://docs.zapier.com/sdk/cli-reference
- **TypeScript SDK — build production integrations and agent tools:** the SDK is for shipping. Use it when you need something repeatable, embedded, or in production — a scheduled workflow, a backend service, a tool inside an AI agent. It's type-safe, handles token refresh and retries automatically, and uses the same app keys, action keys, and input shapes you already discovered via the CLI. See the SDK reference: https://docs.zapier.com/sdk/reference

**Want to run a quick test?**

If I have a Slack connection, offer to send a DM to yourself on Slack. Describe the steps that will happen and end with: "Want to run this quick test?" Then STOP. Do not output anything else. Do not continue to the next section. Wait for my reply before proceeding.

When I reply to the quick test, only proceed if my response is a clear, unambiguous affirmative (e.g. "yes", "go ahead"). If ambiguous or unclear, skip the test and continue.

If I don't have a Slack connection, skip the test and continue.

---

When I reply yes to the quick test, run these exact commands in order:

1. Look up my Slack username:
   npx zapier-sdk run-action slack search user_by_email --connection-id ID --inputs '{"email":"ZAPIER_EMAIL"}'

2. Send a direct message to yourself using the username from step 1:
   npx zapier-sdk run-action slack write direct_message --connection-id ID --inputs '{"channel":"USERNAME","text":"Hello via Zapier SDK 👋"}'

Replace ID with my Slack connection ID from the table above. Replace ZAPIER_EMAIL with my Zapier login email. Replace USERNAME with the username returned from step 1.

If user_by_email fails, ask me for my Slack email and try again.

---

After the test completes (or if I skip it, or if there's no Slack connection):

Pick 1–3 apps from the connections table and show me the commands I could use to explore what actions they support. Do not run these commands — just display them so I can try on my own. For example:
   npx zapier-sdk list-actions APP_KEY

**All set! Now, a few ideas to start exploring what the Zapier SDK can do:**

Suggest 3 ideas worth exploring — good starting points based on my connected apps. Each idea reads from one app, optionally processes it, and writes to another. Do not suggest anything event-driven. Keep each idea to one sentence. Examples: "get all your Jira issues still In Progress and DM yourself a tidy table on Slack"; "pull every HubSpot deal that closed this week and drop it into a Google Sheet". Make the ideas specific to my connected apps — not generic.
```

***

## Prerequisites

* Node.js 20+ installed
* A [Zapier account](https://zapier.com/sign-up) (free tier works)
* 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 provides a simple browser-based authentication flow:

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

This opens your browser to authenticate with Zapier. Your token is stored locally, and as long as you have the CLI package installed as a development dependency, the SDK will automatically use it.

<Warning>
  **Building for production or deploying to a server?** Browser-based login only
  works in your local development environment. For any server-side deployment,
  [client credentials](/sdk/deploy) are the recommended approach.
</Warning>

<AccordionGroup>
  <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 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) — 9,000+ 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
