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

# Using the CLI

The Zapier SDK CLI lets you explore and run actions across 8,000+ apps directly from your terminal, authenticated, with no OAuth setup required. It's the fastest way to understand what an app can do and what inputs an action needs before writing any code.

## 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=Help%20me%20get%20started%20with%20the%20Zapier%20SDK%20CLI.%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%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%0A2.%20Check%20whether%20the%20CLI%20is%20already%20available%3A%20zapier-sdk%20--version%0A%20%20%20-%20If%20available%2C%20skip%20the%20install%20step.%0A%20%20%20-%20If%20not%20available%2C%20install%20it%20globally%3A%20npm%20install%20-g%20%40zapier%2Fzapier-sdk-cli%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%0A3.%20Install%20the%20Zapier%20SDK%20skill%20%E2%80%94%20it%20covers%20both%20SDK%20and%20CLI%20patterns%3A%20npx%20skills%20add%20zapier%2Fsdk%20-y%0A%0A4.%20Log%20in%20to%20Zapier%3A%20zapier-sdk%20login%20--non-interactive%0A%20%20%20-%20The%20--non-interactive%20flag%20tells%20the%20CLI%20not%20to%20ask%20interactive%20questions%2C%20so%20login%20won't%20stall%20waiting%20on%20you.%20Always%20pass%20it%20when%20running%20login%20on%20the%20user's%20behalf.%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%0A5.%20List%20my%20connected%20apps%3A%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%0AThe%20Zapier%20SDK%20CLI%20is%20the%20fastest%20way%20to%20explore%20what%20an%20app%20can%20do%20and%20run%20actions%20interactively%20%E2%80%94%20yourself%20in%20a%20terminal%2C%20or%20an%20agent%20executing%20a%20task%20on%20demand.%20Each%20command%20takes%20an%20app%20key%20(like%20%22slack%22%20or%20%22google-sheets%22)%20and%20most%20action%20commands%20take%20a%20--connection-id%20for%20which%20authenticated%20account%20to%20use.%20The%20main%20commands%3A%0A%0A-%20**Discover%20apps%3A**%20%60zapier-sdk%20list-apps%20--search%20%22%3Cterm%3E%22%60%0A-%20**Discover%20actions%20for%20an%20app%3A**%20%60zapier-sdk%20list-actions%20%3Capp%3E%60%0A-%20**Inspect%20what%20an%20action%20needs%3A**%20%60zapier-sdk%20list-input-fields%20%3Capp%3E%20%3Caction-type%3E%20%3Caction-key%3E%60%0A-%20**Run%20an%20action%3A**%20%60zapier-sdk%20run-action%20%3Capp%3E%20%3Caction-type%3E%20%3Caction-key%3E%20--connection-id%20%3CID%3E%20--inputs%20'%7B%22key%22%3A%22value%22%7D'%60%0A-%20**Make%20raw%20authenticated%20requests%3A**%20%60zapier-sdk%20curl%20%3Capp%3E%20--connection-id%20%3CID%3E%20--%20%3Curl%3E%60%0A%0ASee%20the%20full%20CLI%20reference%3A%20https%3A%2F%2Fdocs.zapier.com%2Fsdk%2Fcli-reference%0A%0A**Want%20to%20try%20something%3F**%0A%0APick%201%E2%80%933%20apps%20from%20the%20connections%20table%20and%20show%20me%20the%20commands%20I%20could%20use%20to%20explore%20each.%20Do%20not%20run%20these%20commands%20yet%20%E2%80%94%20just%20display%20them%20so%20I%20can%20try%20on%20my%20own.%20For%20example%3A%0A%20%20%20zapier-sdk%20list-actions%20slack%20--json%20%7C%20head%0A%0AIf%20you're%20feeling%20adventurous%2C%20suggest%20one%20specific%20end-to-end%20action%20I%20could%20try%20based%20on%20my%20connected%20apps.%20Show%20me%20the%20inspect%20step%20first%20(list-input-fields)%2C%20then%20the%20run%20step.%20Keep%20it%20to%20one%20action%20%E2%80%94%20not%20a%20sequence.%20Examples%3A%20%22DM%20yourself%20on%20Slack%20using%20write%2Fdirect_message%22%3B%20%22List%20your%20most%20recent%20Jira%20issues%20using%20read%2Flist_issues%22.%20Make%20the%20suggestion%20specific%20to%20my%20actual%20connected%20apps%20%E2%80%94%20not%20generic." 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=Help%20me%20get%20started%20with%20the%20Zapier%20SDK%20CLI.%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%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%0A2.%20Check%20whether%20the%20CLI%20is%20already%20available%3A%20zapier-sdk%20--version%0A%20%20%20-%20If%20available%2C%20skip%20the%20install%20step.%0A%20%20%20-%20If%20not%20available%2C%20install%20it%20globally%3A%20npm%20install%20-g%20%40zapier%2Fzapier-sdk-cli%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%0A3.%20Install%20the%20Zapier%20SDK%20skill%20%E2%80%94%20it%20covers%20both%20SDK%20and%20CLI%20patterns%3A%20npx%20skills%20add%20zapier%2Fsdk%20-y%0A%0A4.%20Log%20in%20to%20Zapier%3A%20zapier-sdk%20login%20--non-interactive%0A%20%20%20-%20The%20--non-interactive%20flag%20tells%20the%20CLI%20not%20to%20ask%20interactive%20questions%2C%20so%20login%20won't%20stall%20waiting%20on%20you.%20Always%20pass%20it%20when%20running%20login%20on%20the%20user's%20behalf.%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%0A5.%20List%20my%20connected%20apps%3A%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%0AThe%20Zapier%20SDK%20CLI%20is%20the%20fastest%20way%20to%20explore%20what%20an%20app%20can%20do%20and%20run%20actions%20interactively%20%E2%80%94%20yourself%20in%20a%20terminal%2C%20or%20an%20agent%20executing%20a%20task%20on%20demand.%20Each%20command%20takes%20an%20app%20key%20(like%20%22slack%22%20or%20%22google-sheets%22)%20and%20most%20action%20commands%20take%20a%20--connection-id%20for%20which%20authenticated%20account%20to%20use.%20The%20main%20commands%3A%0A%0A-%20**Discover%20apps%3A**%20%60zapier-sdk%20list-apps%20--search%20%22%3Cterm%3E%22%60%0A-%20**Discover%20actions%20for%20an%20app%3A**%20%60zapier-sdk%20list-actions%20%3Capp%3E%60%0A-%20**Inspect%20what%20an%20action%20needs%3A**%20%60zapier-sdk%20list-input-fields%20%3Capp%3E%20%3Caction-type%3E%20%3Caction-key%3E%60%0A-%20**Run%20an%20action%3A**%20%60zapier-sdk%20run-action%20%3Capp%3E%20%3Caction-type%3E%20%3Caction-key%3E%20--connection-id%20%3CID%3E%20--inputs%20'%7B%22key%22%3A%22value%22%7D'%60%0A-%20**Make%20raw%20authenticated%20requests%3A**%20%60zapier-sdk%20curl%20%3Capp%3E%20--connection-id%20%3CID%3E%20--%20%3Curl%3E%60%0A%0ASee%20the%20full%20CLI%20reference%3A%20https%3A%2F%2Fdocs.zapier.com%2Fsdk%2Fcli-reference%0A%0A**Want%20to%20try%20something%3F**%0A%0APick%201%E2%80%933%20apps%20from%20the%20connections%20table%20and%20show%20me%20the%20commands%20I%20could%20use%20to%20explore%20each.%20Do%20not%20run%20these%20commands%20yet%20%E2%80%94%20just%20display%20them%20so%20I%20can%20try%20on%20my%20own.%20For%20example%3A%0A%20%20%20zapier-sdk%20list-actions%20slack%20--json%20%7C%20head%0A%0AIf%20you're%20feeling%20adventurous%2C%20suggest%20one%20specific%20end-to-end%20action%20I%20could%20try%20based%20on%20my%20connected%20apps.%20Show%20me%20the%20inspect%20step%20first%20(list-input-fields)%2C%20then%20the%20run%20step.%20Keep%20it%20to%20one%20action%20%E2%80%94%20not%20a%20sequence.%20Examples%3A%20%22DM%20yourself%20on%20Slack%20using%20write%2Fdirect_message%22%3B%20%22List%20your%20most%20recent%20Jira%20issues%20using%20read%2Flist_issues%22.%20Make%20the%20suggestion%20specific%20to%20my%20actual%20connected%20apps%20%E2%80%94%20not%20generic." 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=Help%20me%20get%20started%20with%20the%20Zapier%20SDK%20CLI.%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%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%0A2.%20Check%20whether%20the%20CLI%20is%20already%20available%3A%20zapier-sdk%20--version%0A%20%20%20-%20If%20available%2C%20skip%20the%20install%20step.%0A%20%20%20-%20If%20not%20available%2C%20install%20it%20globally%3A%20npm%20install%20-g%20%40zapier%2Fzapier-sdk-cli%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%0A3.%20Install%20the%20Zapier%20SDK%20skill%20%E2%80%94%20it%20covers%20both%20SDK%20and%20CLI%20patterns%3A%20npx%20skills%20add%20zapier%2Fsdk%20-y%0A%0A4.%20Log%20in%20to%20Zapier%3A%20zapier-sdk%20login%20--non-interactive%0A%20%20%20-%20The%20--non-interactive%20flag%20tells%20the%20CLI%20not%20to%20ask%20interactive%20questions%2C%20so%20login%20won't%20stall%20waiting%20on%20you.%20Always%20pass%20it%20when%20running%20login%20on%20the%20user's%20behalf.%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%0A5.%20List%20my%20connected%20apps%3A%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%0AThe%20Zapier%20SDK%20CLI%20is%20the%20fastest%20way%20to%20explore%20what%20an%20app%20can%20do%20and%20run%20actions%20interactively%20%E2%80%94%20yourself%20in%20a%20terminal%2C%20or%20an%20agent%20executing%20a%20task%20on%20demand.%20Each%20command%20takes%20an%20app%20key%20(like%20%22slack%22%20or%20%22google-sheets%22)%20and%20most%20action%20commands%20take%20a%20--connection-id%20for%20which%20authenticated%20account%20to%20use.%20The%20main%20commands%3A%0A%0A-%20**Discover%20apps%3A**%20%60zapier-sdk%20list-apps%20--search%20%22%3Cterm%3E%22%60%0A-%20**Discover%20actions%20for%20an%20app%3A**%20%60zapier-sdk%20list-actions%20%3Capp%3E%60%0A-%20**Inspect%20what%20an%20action%20needs%3A**%20%60zapier-sdk%20list-input-fields%20%3Capp%3E%20%3Caction-type%3E%20%3Caction-key%3E%60%0A-%20**Run%20an%20action%3A**%20%60zapier-sdk%20run-action%20%3Capp%3E%20%3Caction-type%3E%20%3Caction-key%3E%20--connection-id%20%3CID%3E%20--inputs%20'%7B%22key%22%3A%22value%22%7D'%60%0A-%20**Make%20raw%20authenticated%20requests%3A**%20%60zapier-sdk%20curl%20%3Capp%3E%20--connection-id%20%3CID%3E%20--%20%3Curl%3E%60%0A%0ASee%20the%20full%20CLI%20reference%3A%20https%3A%2F%2Fdocs.zapier.com%2Fsdk%2Fcli-reference%0A%0A**Want%20to%20try%20something%3F**%0A%0APick%201%E2%80%933%20apps%20from%20the%20connections%20table%20and%20show%20me%20the%20commands%20I%20could%20use%20to%20explore%20each.%20Do%20not%20run%20these%20commands%20yet%20%E2%80%94%20just%20display%20them%20so%20I%20can%20try%20on%20my%20own.%20For%20example%3A%0A%20%20%20zapier-sdk%20list-actions%20slack%20--json%20%7C%20head%0A%0AIf%20you're%20feeling%20adventurous%2C%20suggest%20one%20specific%20end-to-end%20action%20I%20could%20try%20based%20on%20my%20connected%20apps.%20Show%20me%20the%20inspect%20step%20first%20(list-input-fields)%2C%20then%20the%20run%20step.%20Keep%20it%20to%20one%20action%20%E2%80%94%20not%20a%20sequence.%20Examples%3A%20%22DM%20yourself%20on%20Slack%20using%20write%2Fdirect_message%22%3B%20%22List%20your%20most%20recent%20Jira%20issues%20using%20read%2Flist_issues%22.%20Make%20the%20suggestion%20specific%20to%20my%20actual%20connected%20apps%20%E2%80%94%20not%20generic." 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=Help%20me%20get%20started%20with%20the%20Zapier%20SDK%20CLI.%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%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%0A2.%20Check%20whether%20the%20CLI%20is%20already%20available%3A%20zapier-sdk%20--version%0A%20%20%20-%20If%20available%2C%20skip%20the%20install%20step.%0A%20%20%20-%20If%20not%20available%2C%20install%20it%20globally%3A%20npm%20install%20-g%20%40zapier%2Fzapier-sdk-cli%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%0A3.%20Install%20the%20Zapier%20SDK%20skill%20%E2%80%94%20it%20covers%20both%20SDK%20and%20CLI%20patterns%3A%20npx%20skills%20add%20zapier%2Fsdk%20-y%0A%0A4.%20Log%20in%20to%20Zapier%3A%20zapier-sdk%20login%20--non-interactive%0A%20%20%20-%20The%20--non-interactive%20flag%20tells%20the%20CLI%20not%20to%20ask%20interactive%20questions%2C%20so%20login%20won't%20stall%20waiting%20on%20you.%20Always%20pass%20it%20when%20running%20login%20on%20the%20user's%20behalf.%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%0A5.%20List%20my%20connected%20apps%3A%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%0AThe%20Zapier%20SDK%20CLI%20is%20the%20fastest%20way%20to%20explore%20what%20an%20app%20can%20do%20and%20run%20actions%20interactively%20%E2%80%94%20yourself%20in%20a%20terminal%2C%20or%20an%20agent%20executing%20a%20task%20on%20demand.%20Each%20command%20takes%20an%20app%20key%20(like%20%22slack%22%20or%20%22google-sheets%22)%20and%20most%20action%20commands%20take%20a%20--connection-id%20for%20which%20authenticated%20account%20to%20use.%20The%20main%20commands%3A%0A%0A-%20**Discover%20apps%3A**%20%60zapier-sdk%20list-apps%20--search%20%22%3Cterm%3E%22%60%0A-%20**Discover%20actions%20for%20an%20app%3A**%20%60zapier-sdk%20list-actions%20%3Capp%3E%60%0A-%20**Inspect%20what%20an%20action%20needs%3A**%20%60zapier-sdk%20list-input-fields%20%3Capp%3E%20%3Caction-type%3E%20%3Caction-key%3E%60%0A-%20**Run%20an%20action%3A**%20%60zapier-sdk%20run-action%20%3Capp%3E%20%3Caction-type%3E%20%3Caction-key%3E%20--connection-id%20%3CID%3E%20--inputs%20'%7B%22key%22%3A%22value%22%7D'%60%0A-%20**Make%20raw%20authenticated%20requests%3A**%20%60zapier-sdk%20curl%20%3Capp%3E%20--connection-id%20%3CID%3E%20--%20%3Curl%3E%60%0A%0ASee%20the%20full%20CLI%20reference%3A%20https%3A%2F%2Fdocs.zapier.com%2Fsdk%2Fcli-reference%0A%0A**Want%20to%20try%20something%3F**%0A%0APick%201%E2%80%933%20apps%20from%20the%20connections%20table%20and%20show%20me%20the%20commands%20I%20could%20use%20to%20explore%20each.%20Do%20not%20run%20these%20commands%20yet%20%E2%80%94%20just%20display%20them%20so%20I%20can%20try%20on%20my%20own.%20For%20example%3A%0A%20%20%20zapier-sdk%20list-actions%20slack%20--json%20%7C%20head%0A%0AIf%20you're%20feeling%20adventurous%2C%20suggest%20one%20specific%20end-to-end%20action%20I%20could%20try%20based%20on%20my%20connected%20apps.%20Show%20me%20the%20inspect%20step%20first%20(list-input-fields)%2C%20then%20the%20run%20step.%20Keep%20it%20to%20one%20action%20%E2%80%94%20not%20a%20sequence.%20Examples%3A%20%22DM%20yourself%20on%20Slack%20using%20write%2Fdirect_message%22%3B%20%22List%20your%20most%20recent%20Jira%20issues%20using%20read%2Flist_issues%22.%20Make%20the%20suggestion%20specific%20to%20my%20actual%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={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%20use%20the%20Zapier%20SDK%20CLI%20to%20explore%20and%20run%20actions%20from%20my%20terminal.%20Read%20https%3A%2F%2Fdocs.zapier.com%2Fsdk%2Fusing-the-cli.md%20and%20walk%20me%20through%20getting%20started%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%20use%20the%20Zapier%20SDK%20CLI%20to%20explore%20and%20run%20actions%20from%20my%20terminal.%20Read%20https%3A%2F%2Fdocs.zapier.com%2Fsdk%2Fusing-the-cli.md%20and%20walk%20me%20through%20getting%20started%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%20use%20the%20Zapier%20SDK%20CLI%20to%20explore%20and%20run%20actions%20from%20my%20terminal.%20Read%20https%3A%2F%2Fdocs.zapier.com%2Fsdk%2Fusing-the-cli.md%20and%20walk%20me%20through%20getting%20started%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}
Help me get started with the Zapier SDK CLI. Work through these steps one at a time, running each command in the terminal and telling me what happened before moving on:

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

2. Check whether the CLI is already available: zapier-sdk --version
   - If available, skip the install step.
   - If not available, install it globally: npm install -g @zapier/zapier-sdk-cli
   - An EPERM error on ~/.npm/_cacache usually means the command sandbox is blocking npm's cache writes, not a file permissions issue.

3. Install the Zapier SDK skill — it covers both SDK and CLI patterns: npx skills add zapier/sdk -y

4. Log in to Zapier: zapier-sdk login --non-interactive
   - The --non-interactive flag tells the CLI not to ask interactive questions, so login won't stall waiting on you. Always pass it when running login on the user's behalf.
   - 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.

5. List my connected apps: 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:

The Zapier SDK CLI is the fastest way to explore what an app can do and run actions interactively — yourself in a terminal, or an agent executing a task on demand. Each command takes an app key (like "slack" or "google-sheets") and most action commands take a --connection-id for which authenticated account to use. The main commands:

- **Discover apps:** `zapier-sdk list-apps --search "<term>"`
- **Discover actions for an app:** `zapier-sdk list-actions <app>`
- **Inspect what an action needs:** `zapier-sdk list-input-fields <app> <action-type> <action-key>`
- **Run an action:** `zapier-sdk run-action <app> <action-type> <action-key> --connection-id <ID> --inputs '{"key":"value"}'`
- **Make raw authenticated requests:** `zapier-sdk curl <app> --connection-id <ID> -- <url>`

See the full CLI reference: https://docs.zapier.com/sdk/cli-reference

**Want to try something?**

Pick 1–3 apps from the connections table and show me the commands I could use to explore each. Do not run these commands yet — just display them so I can try on my own. For example:
   zapier-sdk list-actions slack --json | head

If you're feeling adventurous, suggest one specific end-to-end action I could try based on my connected apps. Show me the inspect step first (list-input-fields), then the run step. Keep it to one action — not a sequence. Examples: "DM yourself on Slack using write/direct_message"; "List your most recent Jira issues using read/list_issues". Make the suggestion specific to my actual connected apps — not generic.
```

> **CLI and SDK, complementary by design**
>
> <p>
>   The CLI is built on the SDK and is the fastest way to explore — discover
>   what an app can do, inspect input fields, and run actions interactively. You
>   or an agent can go back and forth with it freely: try an action, check what
>   fields it needs, adjust inputs, repeat. For some agent use cases, the CLI
>   alone may be enough.
> </p>
>
> <p>
>   When you need something repeatable, embedded, or production-grade — a
>   scheduled workflow, a backend integration, a tool in an AI agent — reach for
>   the TypeScript SDK. Everything you learned with the CLI transfers directly:
>   same app keys, same action keys, same input shapes.
> </p>

***

## Before You Start

Install the CLI and authenticate:

```bash theme={null}
npm install @zapier/zapier-sdk
npm install -D @zapier/zapier-sdk-cli

npx zapier-sdk login
```

`login` opens your browser and stores a token locally. The CLI handles everything else automatically.

<AccordionGroup>
  <Accordion title="Alternative: manage credentials programmatically with client credentials">
    Instead of `login`, you can create long-lived client credentials for CI pipelines or environments where a browser flow isn't possible. [Learn how to set them up.](/sdk/deploy)

    ```bash theme={null}
    npx zapier-sdk create-client-credentials "my-script"
    ```

    ```json Response theme={null}
    {
      "client_id": "Abcdefghijklmnopqrstuvwxyz1234567890",
      "name": "my-script",
      "client_secret": "37893783ajshj3hy387893hjjk3jk3839083"
    }
    ```

    Save the `client_secret`; it's only shown once. Use the returned `client_id` and `client_secret` wherever the CLI needs authentication instead of the interactive login token.

    To remove a credential pair when you no longer need it, use the `delete-client-credentials` command and pass the `client_id`:

    ```bash theme={null}
    npx zapier-sdk delete-client-credentials Abcdefghijklmnopqrstuvwxyz1234567890
    ```
  </Accordion>
</AccordionGroup>

***

## Key Concepts

CLI commands work with three concepts: **apps**, **connections**, and **actions**.

An **app** is an integration — Google Sheets, Slack, GitHub. Each app has an **app key**, a short identifier you use in every command (`google-sheets`, `slack`, `github`).

A **connection** is an authenticated account for an app — your personal Google account, a Slack bot account, a CI GitHub account. Each connection has a **connection ID** that you pass with every action call to tell the CLI which account to use.

An **action** is something the app can do — create a spreadsheet, add a row, send a message. Each action has **input fields**: the specific values it needs to run. Some input fields are static; others are dynamic and only appear once you provide context (like which spreadsheet you're targeting as each may have different columns).

## Apps and Connections

**App keys come in two forms.** Commands take an `app` as a positional argument, which can be a short slug like `google-sheets` or a longer key like `GoogleSheetsV2CLIAPI`.

Slugs are easier to type and remember, so use those when you can. When in doubt, search:

```bash theme={null}
npx zapier-sdk list-apps --search "google sheets" --json
```

```json Response theme={null}
[
  {
    "slug": "google-sheets",
    "key": "GoogleSheetsV2CLIAPI",
    "title": "Google Sheets",
    "description": "Create, edit, and share spreadsheets wherever you are with Google Sheets, and get automated insights from your data.",
    ...
  }
]
```

Use the `slug` as the `app` in all subsequent action commands for that specific app.

**Every action needs a connection ID.** A connection ID ties a command to a specific authenticated account, like your Google Sheets connection, Slack account, or GitHub org.

List all connections you already have for an app:

```bash theme={null}
npx zapier-sdk list-connections google-sheets --json
```

```json Response theme={null}
[
  {
    "id": "12345678",
    "title": "foo@example.com",
    "app_key": "GoogleSheetsV2CLIAPI",
    ...
  },
  ...
]
```

Find the first matching connection for your account:

```bash theme={null}
npx zapier-sdk find-first-connection google-sheets --json
```

```json Response theme={null}
{
  "id": "12345678",
  "title": "foo@example.com",
  "app_key": "GoogleSheetsV2CLIAPI",
  ...
}
```

Hold onto that `id`. You'll use it in every action call.

<AccordionGroup>
  <Accordion title="Other ways to find a connection">
    **`find-unique-connection`** has the same syntax as `find-first-connection`, but throws an error if more than one connection matches.
    Use this when you need to be certain you got the right account, not just the first one.

    ```bash theme={null}
    npx zapier-sdk find-unique-connection google-sheets --owner me --json
    ```

    ```text Response theme={null}
    {
      "id": "789101112",
      "date": "2026-02-20T20:40:40Z",
      "account_id": "2000001",
      "is_invite_only": false,
      "is_private": false,
      "shared_with_all": false,
      "lastchanged": "2026-02-20T20:41:10Z",
      "destination_selected_api": null,
      "is_stale": "false",
      "is_shared": "false",
      "marked_stale_at": null,
      "label": "baz@example.com",
      "identifier": null,
      "title": "Google sheets - baz@example.com",
      "url": "http://zapier.com/api/authentications/v1/authentications/789101112",
      "groups": [],
      "members": "",
      "permissions": {
        "delete": true,
        "edit": true,
        "reconnect": true,
        "share": true,
        "test": true,
        "transfer": true,
        "use": true
      },
      "implementation_id": "GoogleSheetsV2CLIAPI@2.10.1",
      "profile_id": "7777777",
      "is_expired": "false",
      "expired_at": null,
      "app_key": "GoogleSheetsV2CLIAPI",
      "app_version": "2.10.1"
    }
    ```

    **`list-connections`** returns all matching connections as a paginated list.
    Useful when you have multiple Google accounts connected and need to pick the right one.

    ```bash theme={null}
    npx zapier-sdk list-connections google-sheets --json
    ```

    **`find-first-connection` with `--owner me`** filters to only connections you own, useful in shared Zapier accounts:

    ```bash theme={null}
    npx zapier-sdk find-first-connection google-sheets --owner me --json
    ```

    **Filter to expired connections** to audit which connections need to be re-authenticated:

    ```bash theme={null}
    npx zapier-sdk list-connections google-sheets --is-expired --json
    ```
  </Accordion>
</AccordionGroup>

***

## Walkthrough: Create a Spreadsheet, Then Add Rows

This walkthrough shows the full pattern: connect to an app, discover what it can do, figure out what inputs an action needs, and run it.

We'll create a new Google Sheet with a header row and then add rows to it.

### Explore available actions

```bash theme={null}
npx zapier-sdk list-actions google-sheets --json
```

```json Response theme={null}
[
  {
    "key": "get_many_rows",
    "title": "Get Many Spreadsheet Rows (Advanced)",
    "action_type": "search",
    "description": "Return up to 1,500 rows as a single JSON value or as line items.",
    ...
  },
  ...,
  {
    "key": "lookup_row",
    "title": "Lookup Spreadsheet Row",
    "action_type": "search",
    "description": "Find a specific spreadsheet row based on a column and value. If found, it returns the entire row.",
    ...
  },
  ...,
  {
    "key": "lookup_row",
    "title": "Find or Create Row",
    "action_type": "search_or_write",
    "description": "Finds or creates a specific lookup row.",
    ...
  },
  ...,
  {
    "key": "add_row",
    "title": "Create Spreadsheet Row",
    "action_type": "write",
    "description": "Create a new row in a specific spreadsheet.",
    ...
  },
  ...,
  {
    "key": "create_spreadsheet",
    "title": "Create Spreadsheet",
    "action_type": "write",
    "description": "Creates a new spreadsheet. Choose from a blank spreadsheet, a copy of an existing one, or one with headers.",
    ...
  },
  {
    "key": "create_worksheet",
    "title": "Create Worksheet",
    "action_type": "write",
    "description": "Creates a new worksheet in a Google Sheet.",
    ...
  },
  ...
]
```

Filter by action type to narrow things down:

```bash theme={null}
npx zapier-sdk list-actions google-sheets --action-type write --json
```

```json Response theme={null}
[
  {
    "key": "add_row",
    "title": "Create Spreadsheet Row",
    "action_type": "write",
    "description": "Create a new row in a specific spreadsheet.",
    ...
  },
  ...,
  {
    "key": "create_spreadsheet",
    "title": "Create Spreadsheet",
    "action_type": "write",
    "description": "Creates a new spreadsheet. Choose from a blank spreadsheet, a copy of an existing one, or one with headers.",
    ...
  },
  {
    "key": "create_worksheet",
    "title": "Create Worksheet",
    "action_type": "write",
    "description": "Creates a new worksheet in a Google Sheet.",
    ...
  },
  ...
]
```

<AccordionGroup>
  <Accordion title="Other ways to explore actions">
    **`get-action`** is for when you already know the action key and want its full detail instead of scanning a list:

    ```bash theme={null}
    npx zapier-sdk get-action google-sheets write create_spreadsheet --json
    ```

    ```json Response theme={null}
    {
      "key": "create_spreadsheet",
      "title": "Create Spreadsheet",
      "action_type": "write",
      "description": "Creates a new spreadsheet. Choose from a blank spreadsheet, a copy of an existing one, or one with headers.",
      ...
    }
    ```

    **`--page-size`** is useful when apps like Salesforce or HubSpot have many actions and you want to page through the results

    ```bash theme={null}
    npx zapier-sdk list-actions hubspot --action-type write --page-size 20
    ```
  </Accordion>
</AccordionGroup>

***

### Inspect spreadsheet creation inputs

Before running an action, use `list-input-fields` to see exactly what it expects:

```bash theme={null}
npx zapier-sdk list-input-fields google-sheets write create_spreadsheet \
  --connection-id 789101112 --json
```

```json Response theme={null}
[
  {
    "key": "drive",
    "title": "Drive",
    "is_required": false,
    "description": "Select the Google Drive location for your spreadsheet. Choose between My Drive or a Shared Drive; the former is the default.",
    ...
  },
  {
    "key": "title",
    "title": "Title",
    "is_required": true,
    "description": "Enter the name of the new spreadsheet.",
    ...
  },
  {
    "key": "spreadsheet_to_copy",
    "title": "Spreadsheet to Copy",
    "is_required": false,
    "description": "Select a spreadsheet to duplicate.",
    ...
  },
  {
    "key": "headers",
    "title": "Headers",
    "is_required": false,
    "description": "Enter column headers for your new spreadsheet. These will be ignored if \"Spreadsheet to Copy\" is selected.",
    ...
  }
]
```

<AccordionGroup>
  <Accordion title="Other ways to inspect input fields">
    **`get-input-fields-schema`** returns the same information as a JSON Schema object instead of a list. Useful when you're building an agent tool definition or need machine-readable validation rules:

    ```bash theme={null}
    npx zapier-sdk get-input-fields-schema google-sheets write create_spreadsheet \
      --connection-id 789101112 --json
    ```

    ```json Response theme={null}
    {
      "$schema": "http://json-schema.org/draft-06/schema#",
      "type": "object",
      "properties": {
        "drive": {
          "type": "string",
          "zapier:dynamicEnum": true,
          "title": "Drive",
          "description": "Select the Google Drive location for your spreadsheet. Choose between My Drive or a Shared Drive; the former is the default."
        },
        "title": {
          "type": "string",
          "title": "Title",
          "description": "Enter the name of the new spreadsheet."
        },
        "spreadsheet_to_copy": {
          "type": "string",
          "zapier:dynamicEnum": true,
          "title": "Spreadsheet to Copy",
          "description": "Select a spreadsheet to duplicate."
        },
        "headers": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "title": "Headers",
          "description": "Enter column headers for your new spreadsheet. These will be ignored if \"Spreadsheet to Copy\" is selected."
        }
      },
      "additionalProperties": false,
      "required": ["title"]
    }
    ```
  </Accordion>
</AccordionGroup>

***

### Create a spreadsheet

```bash theme={null}
npx zapier-sdk run-action google-sheets write create_spreadsheet \
  --connection-id 789101112 \
  --inputs '{"title": "Zapier SDK CLI Demo", "headers": ["Name", "Email", "Role"]}' \
  --json
```

```json Response theme={null}
[
  {
    "id": "3780-dhjhj34784jjh4kkl48_48934uk-49834jkA237",
    "worksheet_id": 0,
    "url": "https://docs.google.com/spreadsheets/d/3780-dhjhj34784jjh4kkl48_48934uk-49834jkA237/edit?ouid=112649538831883565437"
  }
]
```

The `headers` field populates the first row of the default sheet (`Sheet1`) in one step — no separate worksheet creation needed.

Note the spreadsheet `id` — that's your `spreadsheetId`.

The response also includes a `worksheetId` field (the numeric sheet ID, `0` for the default sheet); you'll pass both to `add_row`.

***

### Inspect row creation inputs

Without context, `list-input-fields` returns only the structural fields — spreadsheet and worksheet selectors, but no column fields:

```bash theme={null}
npx zapier-sdk list-input-fields google-sheets write add_row \
  --connection-id 789101112 --json
```

```json Response theme={null}
[
  {
    "key": "spreadsheet",
    "title": "Spreadsheet",
    "is_required": true,
    ...
  },
  {
    "key": "worksheet",
    "title": "Worksheet",
    "is_required": true,
    "description": "Worksheets must have column headers. Learn more about [spreadsheet formatting](https://help.zapier.com/hc/en-us/articles/8496276985101-Work-with-Google-Sheets-in-Zaps).",
    ...
  },
  ...
]
```

The column fields are dynamic — they don't exist until the action knows which spreadsheet and worksheet you're targeting. Pass those IDs to get the full field list, including the per-column keys:

```bash theme={null}
npx zapier-sdk list-input-fields google-sheets write add_row \
  --connection-id 789101112 \
  --inputs '{"spreadsheet": "3780-dhjhj34784jjh4kkl48_48934uk-49834jkA237", "worksheet": "0"}' \
  --json
```

```json Response theme={null}
[
  {
    "key": "spreadsheet",
    "title": "Spreadsheet",
    "is_required": true,
    ...
  },
  {
    "key": "worksheet",
    "title": "Worksheet",
    "is_required": true,
    "description": "Worksheets must have column headers. Learn more about [spreadsheet formatting](https://help.zapier.com/hc/en-us/articles/8496276985101-Work-with-Google-Sheets-in-Zaps).",
    ...
  },
  ...,
  {
    "key": "COL$A",
    "title": "Name",
    "is_required": false,
    ...
  },
  {
    "key": "COL$B",
    "title": "Email",
    "is_required": false,
    ...
  },
  {
    "key": "COL$C",
    "title": "Role",
    "is_required": false,
    ...
  }
]
```

`COL$A` maps to "Name", `COL$B` to "Email", and `COL$C` to "Role" — the headers you defined when creating the spreadsheet. These are the keys you'll use in `--inputs` below.

***

### Add rows

```bash theme={null}
npx zapier-sdk run-action google-sheets write add_row \
  --connection-id 789101112 \
  --inputs '{
    "spreadsheet": "3780-dhjhj34784jjh4kkl48_48934uk-49834jkA237",
    "worksheet": "0",
    "COL$A": "Alice",
    "COL$B": "alice@example.com",
    "COL$C": "Engineer"
  }' \
  --json
```

```json Response theme={null}
[
  {
    "COL$A": "Alice",
    "COL$B": "alice@example.com",
    "COL$C": "Engineer",
    "id": 2,
    "row": 2
  }
]
```

```bash theme={null}
npx zapier-sdk run-action google-sheets write add_row \
  --connection-id 789101112 \
  --inputs '{
    "spreadsheet": "3780-dhjhj34784jjh4kkl48_48934uk-49834jkA237",
    "worksheet": "0",
    "COL$A": "Bob",
    "COL$B": "bob@example.com",
    "COL$C": "Designer"
  }' \
  --json
```

```json Response theme={null}
[
  {
    "COL$A": "Bob",
    "COL$B": "bob@example.com",
    "COL$C": "Designer",
    "id": 3,
    "row": 3
  }
]
```

```bash theme={null}
npx zapier-sdk run-action google-sheets write add_row \
  --connection-id 789101112 \
  --inputs '{
    "spreadsheet": "3780-dhjhj34784jjh4kkl48_48934uk-49834jkA237",
    "worksheet": "0",
    "COL$A": "Carol",
    "COL$B": "carol@example.com",
    "COL$C": "Manager"
  }' \
  --json
```

```json Response theme={null}
[
  {
    "COL$A": "Carol",
    "COL$B": "carol@example.com",
    "COL$C": "Manager",
    "id": 4,
    "row": 4
  }
]
```

Check your spreadsheet; all three rows should be there.

***

## Zero Auth Setup

Here's what you just did without writing a single line of auth code:

```
WITHOUT the SDK CLI                        WITH Zapier SDK CLI
─────────────────────────   ─────────────────────
1. Create a Google Cloud project           1. npx zapier-sdk login
2. Enable the Sheets API                   2. npx zapier-sdk run-action …
3. Create a service account
4. Generate and download a JSON key file
5. Generate a Bearer token from the key
6. curl with Authorization header
```

If a user has a Google account connected to Zapier, `find-first-connection` gives you authenticated access immediately. This is true for all 8,000+ apps on Zapier.

***

## Beyond built-in actions

Zapier's 8,000+ apps cover the most common operations, but every API has endpoints that go beyond what's been modeled as actions.

For those cases, use `curl` — it makes authenticated requests to any endpoint directly, with credentials injected automatically from the same connection you've been using.

### GET: Read row data

The Google Sheets API's `values` endpoint returns the raw cell data for a named range, useful as a ground-truth read outside of the SDK action layer:

```bash theme={null}
npx zapier-sdk curl \
  "https://sheets.googleapis.com/v4/spreadsheets/3780-dhjhj34784jjh4kkl48_48934uk-49834jkA237/values/Sheet1" \
  --connection-id 789101112
```

```json Response theme={null}
{
  "range": "Sheet1!A1:Z1004",
  "majorDimension": "ROWS",
  "values": [
    ["Name", "Email", "Role"],
    ["Alice", "alice@example.com", "Engineer"],
    ["Bob", "bob@example.com", "Designer"],
    ["Carol", "carol@example.com", "Manager"]
  ]
}
```

### GET: Spreadsheet metadata

The `spreadsheets.get` endpoint returns full spreadsheet metadata (sheet names, tab structure, locale, timezone) that isn't exposed as a built-in Zapier action:

```bash theme={null}
npx zapier-sdk curl \
  "https://sheets.googleapis.com/v4/spreadsheets/3780-dhjhj34784jjh4kkl48_48934uk-49834jkA237" \
  --connection-id 789101112
```

```json Response theme={null}
{
  "spreadsheetId": "3780-dhjhj34784jjh4kkl48_48934uk-49834jkA237",
  "properties": {
    "title": "Zapier SDK CLI Demo",
    "locale": "en_US",
    "timeZone": "Etc/GMT",
    ...
  },
  "sheets": [
    {
      "properties": {
        "sheetId": 0,
        "title": "Sheet1",
        "sheetType": "GRID",
        ...
      }
    }
  ]
}
```

No token. No `Authorization` header. No OAuth setup. Zapier injects the user's stored credentials automatically.

### POST: Add a row directly via the API

```bash theme={null}
npx zapier-sdk curl \
  "https://sheets.googleapis.com/v4/spreadsheets/3780-dhjhj34784jjh4kkl48_48934uk-49834jkA237/values/Sheet1:append?valueInputOption=USER_ENTERED" \
  --connection-id 789101112 \
  -X POST \
  --json '{"values": [["Dave", "dave@example.com", "Analyst"]]}'
```

```json Response theme={null}
{
  "spreadsheetId": "3780-dhjhj34784jjh4kkl48_48934uk-49834jkA237",
  "tableRange": "Sheet1!A1:C4",
  "updates": {
    "spreadsheetId": "3780-dhjhj34784jjh4kkl48_48934uk-49834jkA237",
    "updatedRange": "Sheet1!A5:C5",
    "updatedRows": 1,
    "updatedColumns": 3,
    "updatedCells": 3
  }
}
```

***

## Scripting and chaining commands

Every command supports `--json` for raw output, making it easy to pipe into `jq` or chain into shell scripts. A common pattern: grab a connection ID and use it immediately:

```bash theme={null}
CONNECTION_ID=$(npx zapier-sdk find-first-connection google-sheets --json | jq -r '.data.id')

npx zapier-sdk run-action google-sheets write create_spreadsheet \
  --connection-id $CONNECTION_ID \
  --inputs '{"title": "Generated Sheet"}' \
  --json
```

Extract just the action keys for an app:

```bash theme={null}
npx zapier-sdk list-actions google-sheets --json | jq '[.[].key]'
```

***

## Next Steps

* [CLI Reference](/sdk/cli-reference): full flag reference for every command
* [API Reference](/sdk/reference): TypeScript SDK methods that mirror everything shown here
