Build up a permission policy for your SDK clients as your code does new things
SDK Permissions let you put guardrails on what your SDK clients can do. When your code makes a request that is not covered by your policy, the SDK pauses and asks you to approve or deny it. Approvals build up into reusable rules over time, so the same prompts do not fire twice.
Experimental, opt-in. SDK Permissions is in active development. It lets you keep your own SDK clients (and the agents running on top of them) within bounds. It’s not an admin-level access-control system; it’s a way for you to set guardrails on your own credentials. The shape of these options may change as the feature stabilizes.
A permission policy is a list of allow and deny rules attached to one of your SDK credentials. You build it up over time: when your code makes a request that is not already covered by the policy, the SDK pauses and prompts you in your browser to add a rule for that scope. Approving adds an allow rule; denying adds a deny rule. Future requests of the same shape are evaluated against those rules without prompting you again.For each request, the backend returns one of three outcomes:
Allowed: matches an existing allow rule. Goes through normally.
Denied: matches an existing deny rule. The SDK throws and there’s no path to retry.
Not yet covered: no rule matches. The SDK prompts you to add one.
When prompted, you pick a scope (typically Read only or Read + Write) and click Approve or Deny. A single connection can need multiple prompts as your code escalates: the read-only allow rule from the first prompt will not cover a later write call, so the SDK prompts again for Read + Write.
An agent acting on your behalf. When you hand your SDK credentials to Claude, Cursor, or another AI agent, permissions give you a per-action checkpoint before it does anything irreversible to your Zapier connections.
A long-running script. A cron job or background worker is running with your credentials. Permissions act as a tripwire: if it ever tries to write somewhere it should not, you’re notified rather than letting it succeed silently.
Both commands provision an OAuth client credential with an empty policy attached. Every request through that credential will require approval until the policy is built up.
poll is for when you’re at the keyboard. The SDK opens the approval page in your browser and blocks until you click Approve.
throw is for when an agent or server is running things. The SDK throws a ZapierApprovalError carrying the approval URL on err.approvalUrl. Whoever is running the code surfaces that URL to a human (Slack DM, chat reply, ticket, email), and the human approves out-of-band.
You usually do not need to set this. If ZAPIER_APPROVAL_MODE (and the approvalMode option) are both unset, the SDK auto-picks based on the environment: poll when stdin and stdout are both interactive TTYs, and throw everywhere else (agents, servers, CI, anything piped).
To override the auto-detected mode, set the env var:
export ZAPIER_APPROVAL_MODE=throw
Or pass approvalMode when you create your SDK client. The constructor option wins over the env var, which wins over the auto-detected default.
Your existing calls work unchanged. When a call needs approval, the flow depends on the mode.Poll mode keeps the call alive while you approve in the browser:Throw mode hands the approval URL off to a human and lets the runner retry later:In throw mode, your agent only needs to do one thing: catch ZapierApprovalError and surface err.approvalUrl to whoever is supervising it.
Not admin-level access control. Permissions are guardrails on your own credentials, not an org-wide policy system. Other people on your team cannot be governed through your policy.
Only OAuth Client Credentials. Permission enforcement applies to SDK clients authenticated via Client Credentials. Clients using other auth methods bypass policies entirely.
Tables are not enrolled yet. Calls through the SDK’s Tables surface are not gated by approvals today, even when the rest of the connection is.
Quickstart: install and authenticate before working through this page.
Using the CLI: explore and run actions from the terminal.
Last modified on September 28, 2026
Was this page helpful?
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Zapier","colors":{"primary":"#FF4F00","light":"#FE6C2A","dark":"#FF4F00"},"logo":{"light":"https://mintcdn.com/zapier-82f0e938/uPbDC0jSuXgHCaWD/logo/light.svg?fit=max\u0026auto=format\u0026n=uPbDC0jSuXgHCaWD\u0026q=85\u0026s=b6a37289cb22ac1a9681572651874765","dark":"https://mintcdn.com/zapier-82f0e938/b1yEJJDZ7v1EncmE/logo/dark.svg?fit=max\u0026auto=format\u0026n=b1yEJJDZ7v1EncmE\u0026q=85\u0026s=2c393c141bc7fbb0051aaa46b103f5e8","href":"https://zapier.com"},"favicon":"https://mintcdn.com/zapier-82f0e938/1jtyk4mqAs_J-p30/favicon.png?fit=max\u0026auto=format\u0026n=1jtyk4mqAs_J-p30\u0026q=85\u0026s=a26d7c83b71f1cdec48ae963245f407f","api":{"openapi":["https://api.zapier.com/schema","api-reference/specs/trigger-inbox.yaml","api-reference/specs/actions.yaml","api-reference/specs/connections.yaml","api-reference/specs/agentic-management.yaml"]},"background":{"color":{"light":"#FFFEFB"}},"navbar":{"primary":{"type":"button","label":"Sign Up","href":"https://zapier.com/sign-up"}},"footer":{},"seo":{"indexing":"all"},"integrations":{"gtm":{"tagId":"GTM-K7GFJTV"}},"contextual":{"options":["copy","view",{"title":"Open in ChatGPT","description":"Ask ChatGPT about this page","icon":"/images/logos/branded/openai.svg","href":{"base":"https://chatgpt.com/","query":[{"key":"q","value":"Read https://docs.zapier.com$path.md and help me apply it. Ask what I am building before giving steps."}]}},{"title":"Open in Claude","description":"Ask Claude about this page","icon":"/images/logos/branded/claude.svg","href":{"base":"https://claude.ai/new","query":[{"key":"q","value":"Read https://docs.zapier.com$path.md and help me apply it. Ask what I am building before giving steps."}]}},{"title":"Open in Perplexity","description":"Ask Perplexity about this page","icon":"/images/logos/branded/perplexity.svg","href":{"base":"https://www.perplexity.ai/search","query":[{"key":"q","value":"Read https://docs.zapier.com$path.md and help me apply it. Ask what I am building before giving steps."}]}},{"title":"Open in Claude Code","description":"Use this page in Claude Code","icon":"/images/logos/branded/claude.svg","href":{"base":"claude://code/new","query":[{"key":"q","value":"Read https://docs.zapier.com$path.md and help me apply it to this project. Check what is already here before giving steps."}]}},{"title":"Open in Codex","description":"Use this page in Codex","icon":"/images/logos/branded/openai.svg","href":{"base":"codex://new","query":[{"key":"prompt","value":"Read https://docs.zapier.com$path.md and help me apply it to this project. Check what is already here before giving steps."}]}},{"title":"Open in Cursor","description":"Use this page in Cursor","icon":"/images/logos/branded/cursor.svg","href":{"base":"cursor://anysphere.cursor-deeplink/prompt","query":[{"key":"text","value":"Read https://docs.zapier.com$path.md and help me apply it to this project. Check what is already here before giving steps."}]}}],"display":"header"},"metadata":{"timestamp":true},"styling":{"latex":false},"navigation":{"global":{"anchors":[{"anchor":"Community","icon":"users","href":"https://community.zapier.com/"},{"anchor":"Changelog","icon":"rss","href":"/white-label/changelog"},{"anchor":"Contact Us","icon":"envelope","href":"https://developer.zapier.com/contact"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"zapier-82f0e938","hasAudioNarration":false,"actualSubdomain":"zapier-82f0e938","customDomains":["docs.zapier.com"],"gitSource":{"type":"gitlab","owner":"zapier/public-api","repo":"public-api-docs","projectId":56036607,"deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae31967ac396e53732162e5","collectionId":"0071120e-7336-4cc3-8f97-881f84145ac0","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae31967ac396e53732162e5"},"feedback":{"thumbs":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"REMOVE_BRANDING":{"status":"ENABLED"},"CONTEXTUAL_FEEDBACK":{"status":"ENABLED"},"CODE_SNIPPET_FEEDBACK":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6ae31967ac396e53732162e5","clientVersion":"0.0.4021","searchFilterCounts":[{"language":"default","tag":"Build a Zapier integration","count":149},{"language":"default","tag":"Developer Platform","count":149},{"language":"default","tag":"Embed Zapier","count":105},{"language":"default","tag":"Powered by Zapier","count":86},{"language":"default","tag":"Use Zapier in your tools","count":79},{"language":"default","tag":"Zapier MCP","count":67},{"language":"default","tag":"API reference","count":60},{"language":"default","tag":"Build with UI","count":52},{"language":"default","tag":"API specification","count":50},{"language":"default","tag":"Get started","count":46}]},"assistantConfig":{"enableStarterQuestions":true,"enableContextualStarterQuestions":false},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"starterQuestions":[{"_id":"6ac8f1f2b9b3f8640f05a146","deploymentId":"67001931f47db52dbf2b872a","questionText":"How do I build a public Zapier integration?","status":"active","generatedBy":"manual","createdAt":"2026-10-09T13:53:54.782Z","updatedAt":"2026-10-09T13:53:54.782Z","__v":0},{"_id":"6ac8f1e5b9b3f8640f05a0d1","deploymentId":"67001931f47db52dbf2b872a","questionText":"What's the difference between the SDK and Platform CLI?","status":"active","generatedBy":"manual","createdAt":"2026-10-09T13:53:41.586Z","updatedAt":"2026-10-09T13:53:41.586Z","__v":0},{"_id":"6ac8f1d4b9b3f8640f05a051","deploymentId":"67001931f47db52dbf2b872a","questionText":"How do I connect Zapier MCP to my MCP client?","status":"active","generatedBy":"manual","createdAt":"2026-10-09T13:53:24.465Z","updatedAt":"2026-10-09T13:53:24.465Z","__v":0}],"googleFontsInlined":false},"customCss":[{"filePath":"styles.css","content":"@font-face{font-family:\"Degular Display - Semibold\";src:url(https://fonts.zapier.com/Degular/DegularDisplay-Semibold.woff2);font-display:fallback;font-weight:400}@font-face{font-family:\"Serrif\";src:url(/fonts/serrif-300.woff2) format('woff2');font-display:swap;font-weight:300;font-style:normal}@font-face{font-family:\"Degular Display\";src:url(/fonts/degular-display-500.woff2) format('woff2');font-display:swap;font-weight:500;font-style:normal}@font-face{font-family:\"Degular Display\";src:url(/fonts/degular-display-600.woff2) format('woff2');font-display:swap;font-weight:600;font-style:normal}h2,h3,h4,header h1{font-family:\"Degular Display - Semibold\";font-weight:400!important;letter-spacing:.08rem!important}#chat-assistant-floating-input,.chat-assistant-floating-input,[data-component-part=chat-assistant-floating-input]{display:none!important}.card h2{font-size:1.2rem}.card code{text-decoration:none}:root:not(.dark) .card,:root:not(.dark) .code-block,:root:not(.dark) .code-block pre,:root:not(.dark) .code-block-background,:root:not(.dark) .code-group,:root:not(.dark) .code-group pre,:root:not(.dark) .shiki{background-color:#fffefb!important}.cta-button,.docs-nav-label{letter-spacing:.01em;text-decoration:none!important}.cta-button{display:inline-flex;align-items:center;gap:8px;padding:12px 24px;width:fit-content;background:#ff4f00;color:#fff!important;font-weight:600;font-size:15px;border:0;border-radius:8px;box-shadow:0 2px 8px rgba(255,79,0,.25);transition:all .2s ease;margin:1em 0}.cta-button:hover{background:#e64600;color:#fff!important;text-decoration:none!important;box-shadow:0 4px 12px rgba(255,79,0,.35);transform:translateY(-1px)}.cta-button:active{transform:translateY(0);box-shadow:0 1px 4px rgba(255,79,0,.3)}blockquote.sr-only+h2{margin-top:0}#navbar a[href=\"https://zapier.com\"],#navbar a[href=\"https://zapier.com\"] img{padding-right:0!important;margin-right:0!important}.docs-nav-label{color:#201515!important;font-family:\"Degular Display - Medium\",ui-sans-serif,system-ui,sans-serif;font-weight:400;font-size:1.5rem;margin-left:-.6rem;transition:color .15s ease;vertical-align:middle;cursor:pointer}.docs-nav-label:hover{color:#939084!important;text-decoration:none!important}.dark .docs-nav-label{color:#fffefb!important}.dark .docs-nav-label:hover{color:#c5c0b1!important}[role=menu]:focus,[role=menu]:focus-visible{outline-width:1px}footer:not(#zapier-universal-footer){display:none!important}#zapier-universal-footer{display:block!important;background-color:#fffdf9;font-family:'Inter',Helvetica,arial,sans-serif;font-size:14px;line-height:24px;color:#201515;-webkit-font-smoothing:antialiased;width:100%;margin-top:2rem}.dark #zapier-universal-footer{background-color:#2d2e2e;color:#fffdf9}.zuf{max-width:1200px;margin:0 auto;padding:30px;display:grid;grid-template-rows:auto;grid-template-columns:100%;grid-template-areas:'links' 'socials' 'logo' 'meta';justify-items:center;align-items:center;gap:30px}@media (min-width:650px){.zuf{grid-template-columns:max-content 1fr;grid-template-areas:'links links' 'socials socials' 'logo meta'}}@media (min-width:980px){.zuf{grid-template-columns:max-content 1fr;grid-template-areas:'socials links' 'logo meta'}}.zuf-row--bottom,.zuf-row--top{display:contents}.zuf-socials{grid-area:socials;display:inline-flex;flex-wrap:wrap;align-items:center;gap:10px}@media (min-width:980px){.zuf-socials{justify-self:start}}.zuf-follow{font-size:14px;line-height:20px;font-weight:400;color:#574e4c;white-space:nowrap}.dark .zuf-follow{color:#a8a5a0}.zuf-icon{display:flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:100%;background-color:#a8a5a0;text-decoration:none!important;transition:background-color .15s ease}.zuf-icon img,.zuf-icon svg{width:16px;height:16px;fill:#fffdf9}.dark .zuf-icon{background-color:#403f3e}.dark .zuf-icon svg,.dark .zuf-logo path{fill:#fffdf9}.zuf-icon[aria-label*=Facebook]:focus,.zuf-icon[aria-label*=Facebook]:hover{background-color:#3b5998;outline:0}.zuf-icon[aria-label*=LinkedIn]:focus,.zuf-icon[aria-label*=LinkedIn]:hover{background-color:#0976b4;outline:0}.zuf-icon[aria-label*=X]:focus,.zuf-icon[aria-label*=X]:hover{background-color:#00aced;outline:0}.zuf-icon[aria-label*=YouTube]:focus,.zuf-icon[aria-label*=YouTube]:hover{background-color:#e52d27;outline:0}.zuf-icon[aria-label*=blog]:focus,.zuf-icon[aria-label*=blog]:hover{background-color:#ff4f00;outline:0}.zuf-links{grid-area:links;display:flex;flex-wrap:wrap;align-items:center;justify-content:center;column-gap:12.5px;row-gap:10px;width:100%}@media (min-width:980px){.zuf-links{justify-content:flex-end}}.zuf-links a{font-family:'Inter',Helvetica,arial,sans-serif;font-size:14px;line-height:24px;font-weight:500;color:#201515!important;padding:0 5px;white-space:nowrap;text-decoration:none!important}.zuf-links a:focus,.zuf-links a:hover{color:#3d4592!important;outline:0}.dark .zuf-links a{color:#fffdf9!important}.dark .zuf-links a:focus,.dark .zuf-links a:hover,.dark .zuf-meta a:focus,.dark .zuf-meta a:hover{color:#90a1ed!important}.zuf-logo,.zuf-meta a{text-decoration:none!important}.zuf-logo{grid-area:logo;display:inline-flex;align-items:center}.zuf-logo svg{display:block}.zuf-logo path{fill:#201515}.zuf-logo path[fill=\"#FF4F00\"]{fill:#ff4f00!important}@media (min-width:650px){.zuf-logo{justify-self:start}}.zuf-meta{grid-area:meta;font-size:14px;line-height:24px;font-weight:400;color:#574e4c;display:flex;flex-wrap:wrap;align-items:center;justify-content:center;row-gap:10px}.dark .zuf-meta{color:#a8a5a0}.zuf-meta a{padding:5px 10px;color:#574e4c!important}.zuf-meta a:focus,.zuf-meta a:hover{color:#3d4592!important;outline:0}.dark .zuf-meta a{color:#a8a5a0!important}@media (min-width:650px){.zuf-meta{justify-self:end;justify-content:flex-end}}.zuf-meta span{margin-right:10px}@media (max-width:979px){.zuf{padding:20px}}"},{"filePath":"index.css","content":".docs-landing{width:100%;margin:0 auto}#navbar{background:#fffef8!important;backdrop-filter:none!important}.dark #navbar{background:#18181b!important}.docs-landing-hero-bg{background:#201515}.docs-landing-hero-bg .dl-hero-title{color:#fff}.docs-landing-hero-bg .docs-landing-lead{color:rgba(255,255,255,.6)}.dark .docs-landing-hero-bg{background:#26201f;border-bottom:1px solid rgba(255,255,255,.08)}.docs-landing-hero{display:grid;grid-template-columns:minmax(0,1fr);gap:clamp(1.5rem,3.5vw,2.5rem);align-items:center;max-width:1180px;margin:0 auto;padding:48px clamp(1.25rem,4vw,2rem) clamp(1.25rem,2.5vw,1.75rem)}.dl-hero-copy,.docs-landing-hero-inner{text-align:center}.dl-hero-copy{max-width:640px;margin:0 auto}.docs-landing-eyebrow{font-family:\"Inter\",ui-sans-serif,system-ui,sans-serif;font-size:.75rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:#605d52;margin:0 0 1.25rem}.docs-landing-title{font-family:\"Degular Display - Semibold\",ui-sans-serif,system-ui,sans-serif;font-size:clamp(2.25rem,4.5vw,3.25rem);line-height:1.08;font-weight:400!important;margin:0 0 1rem;letter-spacing:.08rem!important}.docs-landing-lead{font-family:\"Inter\",ui-sans-serif,system-ui,sans-serif;font-size:1rem;line-height:1.5;color:#201515;margin:0 auto;max-width:62ch}.dark .docs-landing-lead{color:var(--muted-foreground, #a1a1aa)}.docs-landing-media{border-radius:14px;overflow:hidden;box-shadow:0 1px 2px rgba(15,23,42,.06),0 12px 40px rgba(15,23,42,.12);border:1px solid rgba(255,79,0,.12);background:rgba(255,79,0,.04)}.docs-landing-video{display:block;width:100%;height:auto;vertical-align:middle}.docs-landing-products{max-width:1180px;margin:0 auto;padding:clamp(2.5rem,5vw,4rem) clamp(1.25rem,4vw,2rem) clamp(3rem,6vw,5rem)}.docs-landing-section-title{font-family:\"Degular Display - Semibold\",ui-sans-serif,system-ui,sans-serif;font-size:clamp(1.5rem,2.5vw,1.875rem);font-weight:400!important;text-align:left;margin:0 0 2.25rem;letter-spacing:.08rem!important}.dl-hero-title{font-family:\"Degular Display\",ui-sans-serif,system-ui,sans-serif;font-size:clamp(2.5rem,4.8vw,3.5rem);line-height:1.1;font-weight:500;letter-spacing:-.03em!important;color:var(--foreground, #18181b);margin:0 0 .6875rem}.dark .dl-hero-demo code,.dark .dl-hero-title{color:var(--foreground, #fafafa)}.dl-hero-title-accent{color:#ff4f00}.dark .dl-hero-title-accent{color:#ff8a5c}.dl-demo-panel,.dl-hero-demo{border:1px solid rgba(9,9,11,.1);overflow:hidden}.dl-hero-demo{display:flex;align-items:center;justify-content:center;aspect-ratio:1/1;min-height:fit-content;padding:clamp(1rem,3vw,1.75rem);border-radius:10px;background-image:url(/images/pattern-abstract.jpg);background-size:cover;background-position:center;background-repeat:no-repeat}.dark .dl-demo-panel,.dark .dl-hero-demo{border-color:rgba(255,255,255,.12)}.dl-demo-panel{width:100%;border-radius:12px;background:#fff;box-shadow:0 1px 2px rgba(15,23,42,.06),0 12px 40px rgba(15,23,42,.14)}.dark .dl-demo-panel{background:#18181b}.dl-demo-clients{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem;padding:.5rem .75rem;border-bottom:1px solid rgba(9,9,11,.08)}.dark .dl-demo-clients{border-bottom-color:rgba(255,255,255,.1)}.dl-demo-chip{width:36px;height:36px;border-radius:8px;border:1px solid rgba(9,9,11,.1);background:#fff;flex:none;margin:0!important}.dark .dl-demo-chip{border-color:rgba(255,255,255,.14)}.dl-demo-chip--padded{padding:6px}.dl-demo-arch-agents{display:flex;gap:.625rem;padding:1rem 1rem .75rem}.dl-demo-arch-col{flex:1;display:flex;flex-direction:column;gap:.375rem}.dl-demo-arch-label{font-size:.6875rem;font-weight:500;color:var(--muted-foreground, #71717a);margin:0 0 .125rem;letter-spacing:.01em}.dl-demo-arch-label--spacer{visibility:hidden;pointer-events:none;user-select:none}.dl-demo-arch-chip{display:flex;align-items:center;gap:.4375rem;padding:.3125rem .5625rem;border-radius:7px;border:1px solid rgba(9,9,11,.1);background:#fff;font-size:.75rem;font-weight:500;color:#09090b;line-height:1;white-space:nowrap}.dl-demo-arch-chip--muted{background:0 0;border-style:dashed;color:var(--muted-foreground, #71717a)}.dl-demo-arch-chip--logo{justify-content:center;padding:.375rem;width:36px;height:36px}.dl-demo-arch-icon{width:22px;height:22px;border-radius:4px;flex:none}.dl-demo-arch-chip--icon-pad .dl-demo-arch-icon{padding:3px}.dl-demo-arch-merge{position:relative;height:28px;margin:0 1rem}.dl-demo-arch-merge::before{content:'';position:absolute;left:25%;right:25%;top:0;height:14px;border-left:1px solid rgba(9,9,11,.1);border-right:1px solid rgba(9,9,11,.1);border-bottom:1px solid rgba(9,9,11,.1);border-bottom-left-radius:4px;border-bottom-right-radius:4px}.dl-demo-arch-merge::after{content:'';position:absolute;left:50%;transform:translateX(-50%);top:14px;bottom:0;width:1px;background:rgba(9,9,11,.1)}.dl-demo-arch-zapier{display:flex;align-items:center;justify-content:center;gap:.5rem;margin:0 1rem;padding:.625rem 1rem;border:1px solid rgba(9,9,11,.1);border-radius:10px;background:#fff}.dl-demo-arch-stem{display:flex;justify-content:center;height:20px}.dl-demo-arch-stem::after{content:'';width:1px;height:100%;background:rgba(9,9,11,.1)}.dl-demo-arch-apps{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:.375rem;padding:0 1rem .875rem}.dl-demo-arch-app{display:inline-flex;align-items:center;padding:.25rem .625rem;border-radius:6px;border:1px solid rgba(9,9,11,.1);background:#fff;font-size:.6875rem;font-weight:500;color:#09090b;white-space:nowrap}.dl-demo-arch-app--more{background:0 0;border-color:#e06c2c;color:#e06c2c;font-weight:600;text-decoration:none}.dl-demo-arch-app--more:hover{background:rgba(224,108,44,.06)}.dark .dl-demo-arch-stem::after{background:rgba(255,255,255,.1)}.dark .dl-demo-arch-app,.dark .dl-demo-arch-chip{background:rgba(255,255,255,.06);border-color:rgba(255,255,255,.12);color:#fafafa}.dl-demo-arch-zapier-badge{font-size:.8125rem;font-weight:600;color:#09090b;letter-spacing:-.01em}.dl-demo-arch-zapier-plus{font-size:.8125rem;font-weight:600;color:#e06c2c}.dark .dl-demo-arch-chip--muted{background:0 0;border-color:rgba(255,255,255,.15);color:var(--muted-foreground, #a1a1aa)}.dark .dl-demo-arch-merge::before,.dark .dl-demo-arch-zapier{border-color:rgba(255,255,255,.1)}.dark .dl-demo-arch-merge::after{background:rgba(255,255,255,.1)}.dark .dl-demo-arch-zapier{background:rgba(255,255,255,.04)}.dark .dl-demo-arch-zapier-badge{color:#fafafa}.dl-demo-more{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;border-radius:8px;border:1px dashed rgba(9,9,11,.22);font-size:.9375rem;font-weight:500;line-height:1;color:var(--muted-foreground, #52525b);flex:none}.dark .dl-demo-more{border-color:rgba(255,255,255,.2);color:var(--muted-foreground, #a1a1aa)}.dl-demo-body{display:flex;flex-direction:column;gap:.375rem;padding:.5625rem .75rem .625rem}.dl-demo-prompt,.dl-demo-row{padding:.4375rem .625rem;border:1px solid rgba(9,9,11,.1);border-radius:7px}.dl-demo-prompt{font-size:.75rem;color:var(--muted-foreground, #52525b)}.dl-demo-row{display:flex;align-items:center;justify-content:space-between;gap:1rem}.dark .dl-demo-prompt,.dark .dl-demo-row{border-color:rgba(255,255,255,.12)}.dl-demo-status{font-size:.6875rem;font-weight:700;letter-spacing:.12em;text-transform:uppercase;color:#ff4f00}.dl-demo-action{display:flex;align-items:center;justify-content:space-between;gap:.75rem;padding:.375rem .625rem;border-left:2px solid #ff4f00;border-radius:0 7px 7px 0;background:rgba(9,9,11,.03)}.dark .dl-demo-action{background:rgba(255,255,255,.04)}.dl-demo-action span,.dl-demo-foot{font-size:.75rem;color:var(--muted-foreground, #52525b)}.dl-demo-action span{text-align:right}.dl-demo-foot{display:flex;align-items:center;justify-content:space-between;gap:1rem;padding-top:.25rem}.dl-hero-demo code{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:.75rem;background:0 0;border:0;padding:0;color:var(--foreground, #18181b)}.dl-section{max-width:1180px;margin:0 auto;padding:clamp(1.5rem,3vw,2.25rem) clamp(1.25rem,4vw,2rem)}.dl-eyebrow{font-size:.6875rem;font-weight:700;letter-spacing:.12em;text-transform:uppercase;color:#ff4f00;margin:0 0 .4375rem}.dl-heading{font-size:clamp(1.375rem,2.4vw,1.75rem);line-height:1.2;font-weight:600;letter-spacing:-.01em!important;color:var(--foreground, #18181b);margin:0 0 .5rem;max-width:40ch}.dark .dl-heading{color:var(--foreground, #fafafa)}.dl-lead{font-size:.9375rem;line-height:1.55;color:var(--muted-foreground, #52525b);margin:0 0 1.25rem;max-width:68ch}.dark .dl-lead{color:var(--muted-foreground, #a1a1aa)}.dl-grid{display:grid;gap:.75rem;align-items:stretch}.dl-grid--2{grid-template-columns:repeat(2,minmax(0,1fr))}.dl-grid--3{grid-template-columns:repeat(3,minmax(0,1fr))}.dl-grid--4{grid-template-columns:repeat(4,minmax(0,1fr))}.dl-card{display:flex;flex-direction:column;gap:.5rem;padding:1.125rem 1.25rem 1.25rem;border:1px solid rgba(9,9,11,.1);background:#f8f4f0}.dark .dl-card{border-color:rgba(255,255,255,.12);background:rgba(255,255,255,.02)}.dl-card-mark{align-self:flex-start;margin-bottom:.25rem;color:#ff4f00}.dl-card-eyebrow{font-size:.6875rem;font-weight:700;letter-spacing:.12em;text-transform:uppercase;color:#ff4f00;margin:0}.dl-card-title{font-family:\"Serrif\",ui-serif,serif;font-size:1.5rem;font-weight:300;line-height:1.1;letter-spacing:-.03em;color:var(--foreground, #18181b);margin:0}.dark .dl-card-title{color:var(--foreground, #fafafa)}.dl-card-desc{font-family:\"Inter\",ui-sans-serif,system-ui,sans-serif;font-size:.9375rem;line-height:1.55;color:var(--muted-foreground, #52525b);margin:0}.dark .dl-card-desc,.dark .dl-pill{color:var(--muted-foreground, #a1a1aa)}.dl-pills{display:flex;flex-wrap:wrap;gap:.375rem;margin:.125rem 0 0}.dl-pill{font-size:.75rem;line-height:1;padding:.375rem .625rem;border-radius:999px;border:1px solid rgba(9,9,11,.14);color:var(--muted-foreground, #52525b);white-space:nowrap}.dark .dl-pill{border-color:rgba(255,255,255,.16)}.dl-pill>a{color:inherit!important;text-decoration:none!important}.dl-pill:has(>a):hover{border-color:rgba(9,9,11,.34)}.dark .dl-pill:has(>a):hover{border-color:rgba(255,255,255,.34)}.dl-pill--accent{border-color:rgba(255,79,0,.35);background:rgba(255,79,0,.06);color:#ff4f00}.dark .dl-pill--accent{border-color:rgba(255,79,0,.45);color:#ff8a5c}.dl-code{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:.8125rem;line-height:1.7;background:rgba(9,9,11,.04);border-radius:8px;padding:.75rem .875rem;margin:.125rem 0;overflow-x:auto;color:var(--foreground, #18181b)}.dl-code span{display:block;white-space:pre}.dl-code--shell span::before{content:\"\\276F \";color:#ff4f00}.dark .dl-code{background:rgba(255,255,255,.05);color:var(--foreground, #fafafa)}.dl-cta{margin-top:auto;padding-top:.5rem;font-size:.875rem;font-weight:600;color:#ff4f00!important;text-decoration:none!important}.dl-cta:hover{text-decoration:underline!important}@media screen and (max-width:1024px){.dl-grid--3,.dl-grid--4{grid-template-columns:repeat(2,minmax(0,1fr))}}@media screen and (max-width:640px){.dl-grid--2,.dl-grid--3,.dl-grid--4{grid-template-columns:1fr}}.docs-landing-next{max-width:1180px;margin:0 auto;padding:clamp(1.5rem,3vw,2.25rem) clamp(1.25rem,4vw,2rem) clamp(2.25rem,4vw,3.25rem)}.docs-landing-next-title{font-size:2rem;line-height:1.2;font-weight:600;letter-spacing:-.01em!important;color:var(--foreground, #18181b);margin:0 0 1.25rem}.dark .docs-landing-next-title{color:var(--foreground, #fafafa)}.docs-landing-next-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));column-gap:clamp(1.5rem,4vw,3rem)}.docs-landing-next-item{position:relative;display:block;padding:.875rem 0 1.25rem;border-top:1px solid rgba(9,9,11,.12);text-decoration:none!important;transition:border-top-color .2s ease}.docs-landing-next-item:hover{border-top-color:#ff4f00}.dark .docs-landing-next-item{border-top-color:rgba(255,255,255,.14)}.docs-landing-next-item-title{display:block;font-size:1rem;font-weight:600;color:var(--foreground, #18181b);margin-bottom:.25rem}.docs-landing-next-item-title::after{content:\" \\2192\";color:#ff4f00}.dark .docs-landing-next-item-title{color:var(--foreground, #fafafa)}.docs-landing-next-item:hover .docs-landing-next-item-title{text-decoration:underline}.docs-landing-next-item-desc{display:block;font-size:.9375rem;line-height:1.55;color:var(--muted-foreground, #52525b)}.dark .docs-landing-next-item-desc{color:var(--muted-foreground, #a1a1aa)}@media screen and (max-width:768px){.docs-landing-next-grid{grid-template-columns:1fr}}.hero-container{display:flex;flex-direction:row;align-items:center;justify-content:center;text-align:left;padding:6rem 2rem;width:80%;border-bottom:2px solid #ff4f00;margin:0 auto}.hero-text{width:600px;margin-right:2rem}@media screen and (max-width:1024px){.docs-landing-hero{grid-template-columns:1fr}.docs-landing-media{max-width:640px;margin:0 auto}}@media screen and (max-width:1300px){.hero-container{flex-direction:column;text-align:center}.hero-text{margin-right:0;margin-bottom:2rem}.hero-video{max-width:600px}}.dl-section-heading{font-size:2rem;line-height:1.2;font-weight:600;letter-spacing:-.01em!important;color:var(--foreground, #18181b);margin:0 0 1.25rem}.dark .dl-section-heading{color:var(--foreground, #fafafa)}.dl-bands{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:.75rem}.dl-band,.dl-band-main{display:flex;flex-direction:column}.dl-band{border:1px solid rgba(9,9,11,.1);overflow:hidden;background:#f8f4f0}.dark .dl-band{border-color:rgba(255,255,255,.12);background:rgba(255,255,255,.02)}.dl-band-main{gap:.5rem;padding:1.125rem 1.25rem 1.25rem;border-bottom:1px solid rgba(9,9,11,.1)}.dark .dl-band-main{background:rgba(255,255,255,.02);border-bottom-color:rgba(255,255,255,.12)}.dl-band-badge{align-self:flex-start;margin:0;padding:.1875rem .4375rem;border:1px solid rgba(255,79,0,.4);border-radius:5px;font-size:.625rem;font-weight:700;letter-spacing:.12em;text-transform:uppercase;color:#ff4f00}.dl-band-title{font-family:\"Serrif\",ui-serif,serif;font-size:1.5rem;font-weight:300!important;line-height:1.1;letter-spacing:-.03em!important;color:var(--foreground, #18181b);margin:.125rem 0 0!important}.dark .dl-band-title{color:var(--foreground, #fafafa)}.dl-band-icon,.dl-band-title-mark{align-self:flex-start;margin-bottom:16px;color:#ff4f00}.dl-band-icon{margin-bottom:8px}.dl-band-desc{font-family:\"Inter\",ui-sans-serif,system-ui,sans-serif;font-size:.9375rem;line-height:1.55;color:var(--muted-foreground, #52525b);margin:0;max-width:none}.dark .dl-band-desc{color:var(--muted-foreground, #a1a1aa)}.dl-band-main .dl-hero-demo{box-shadow:none;margin-top:.375rem}.dl-band-media{display:block;width:100%;height:auto;border:1px solid rgba(9,9,11,.1);border-radius:10px;margin:.375rem 0 0!important}.dark .dl-band-media{border-color:rgba(255,255,255,.12)}.dl-band-list{display:flex;flex:1;flex-direction:column}.dl-band-row{position:relative;display:grid;grid-template-columns:28px 1fr;grid-template-rows:auto auto;column-gap:.625rem;row-gap:.1875rem;align-items:center;flex:1;padding:.8125rem 2.25rem .8125rem 1.25rem;border-bottom:1px solid rgba(9,9,11,.08);text-decoration:none!important;transition:background .15s ease}.dl-band-row .dl-band-row-icon{grid-row:1/-1;align-self:center}.dl-band-row .dl-band-row-desc,.dl-band-row .dl-band-row-title{grid-column:2}.dl-band-row:not(:has(.dl-band-row-icon)){grid-template-columns:1fr}.dl-band-row:not(:has(.dl-band-row-icon)) .dl-band-row-desc,.dl-band-row:not(:has(.dl-band-row-icon)) .dl-band-row-title{grid-column:1}.dark .dl-band-row{border-bottom-color:rgba(255,255,255,.1)}.dl-band-row:last-child{border-bottom:none}.dl-band-row:hover{background:rgba(255,79,0,.04)}.dl-band-row::after{content:\"\\2192\";position:absolute;top:50%;right:1rem;transform:translateY(-50%);font-size:1rem;color:#ff4f00;transition:transform .15s ease}.dl-band-row:hover::after{transform:translateY(-50%) translateX(2px)}.dl-band-row>a,.docs-landing-next-item>a{position:absolute;inset:0;z-index:1}.dl-band-row>a:focus-visible,.docs-landing-next-item>a:focus-visible{outline:2px solid #ff4f00;outline-offset:-2px}.dl-band-row-icon{display:flex;align-items:center;justify-content:center;flex-shrink:0;width:28px;height:28px;color:#ff4f00}.dark .dl-band-row-icon{color:#ff8a5c}.dl-band-row-icon svg{width:16px;height:16px}.dl-band-row-title{font-size:.9375rem;font-weight:600;color:var(--foreground, #18181b)}.dark .dl-band-row-title{color:var(--foreground, #fafafa)}.dl-band-row:hover .dl-band-row-title{text-decoration:underline}.dl-band-row-desc{font-size:.875rem;line-height:1.5;color:var(--muted-foreground, #52525b)}.dark .dl-band-row-desc{color:var(--muted-foreground, #a1a1aa)}@media screen and (max-width:900px){.dl-bands{grid-template-columns:1fr}}"}],"page":{"pagePath":"sdk/permissions","slug":"/sdk/permissions","pageMetadata":{"title":"Permissions","description":"Build up a permission policy for your SDK clients as your code does new things","tag":"Experimental","href":"/sdk/permissions"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Build up a permission policy for your SDK clients as your code does new things\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Mermaid,Tip,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Mermaid)_missingMdxReference(`Mermaid`,true);if(!Tip)_missingMdxReference(`Tip`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`SDK Permissions let you put guardrails on what your SDK clients can do. When your code makes a request that is not covered by your policy, the SDK pauses and asks you to approve or deny it. Approvals build up into reusable rules over time, so the same prompts do not fire twice.`}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Experimental, opt-in.`}),` SDK Permissions is in active development. It lets you keep your own SDK clients (and the agents running on top of them) within bounds. It’s not an admin-level access-control system; it’s a way for you to set guardrails on your own credentials. The shape of these options may change as the feature stabilizes.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`what-it-is`,children:`What It Is`}),`\n`,_jsxs(_components.p,{children:[`A `,_jsx(_components.strong,{children:`permission policy`}),` is a list of allow and deny rules attached to one of your SDK credentials. You build it up over time: when your code makes a request that is not already covered by the policy, the SDK pauses and prompts you in your browser to add a rule for that scope. Approving adds an allow rule; denying adds a deny rule. Future requests of the same shape are evaluated against those rules without prompting you again.`]}),`\n`,_jsx(_components.p,{children:`For each request, the backend returns one of three outcomes:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Allowed`}),`: matches an existing allow rule. Goes through normally.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Denied`}),`: matches an existing deny rule. The SDK throws and there’s no path to retry.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Not yet covered`}),`: no rule matches. The SDK prompts you to add one.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`When prompted, you pick a `,_jsx(_components.strong,{children:`scope`}),` (typically `,_jsx(_components.strong,{children:`Read only`}),` or `,_jsx(_components.strong,{children:`Read + Write`}),`) and click Approve or Deny. A single connection can need multiple prompts as your code escalates: the read-only allow rule from the first prompt will not cover a later write call, so the SDK prompts again for Read + Write.`]}),`\n`,_jsx(Heading,{level:`2`,id:`why-use-it`,children:`Why Use It`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`An agent acting on your behalf.`}),` When you hand your SDK credentials to Claude, Cursor, or another AI agent, permissions give you a per-action checkpoint before it does anything irreversible to your Zapier connections.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`A long-running script.`}),` A cron job or background worker is running with your credentials. Permissions act as a tripwire: if it ever tries to write somewhere it should not, you’re notified rather than letting it succeed silently.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`how-to-use-it`,children:`How to Use It`}),`\n`,_jsx(Heading,{level:`3`,id:`step-1-authenticate-with-approvals-enabled`,children:`Step 1: Authenticate with approvals enabled`}),`\n`,_jsxs(_components.p,{children:[`Run `,_jsx(_components.code,{children:`signup`}),` or `,_jsx(_components.code,{children:`login`}),` with `,_jsx(_components.code,{children:`--use-approvals`}),`:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`npx`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` zapier-sdk`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` signup`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --use-approvals`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Already have a Zapier account? Use `,_jsx(_components.code,{children:`login`}),` instead:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`npx`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` zapier-sdk`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` login`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --use-approvals`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`Both commands provision an OAuth client credential with an empty policy attached. Every request through that credential will require approval until the policy is built up.`}),`\n`,_jsx(Heading,{level:`3`,id:`step-2-pick-an-approval-mode`,children:`Step 2: Pick an approval mode`}),`\n`,_jsx(_components.p,{children:`The SDK has two approval modes:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:_jsx(_components.code,{children:`poll`})}),` is for when you’re at the keyboard. The SDK opens the approval page in your browser and blocks until you click Approve.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:_jsx(_components.code,{children:`throw`})}),` is for when an agent or server is running things. The SDK throws a `,_jsx(_components.code,{children:`ZapierApprovalError`}),` carrying the approval URL on `,_jsx(_components.code,{children:`err.approvalUrl`}),`. Whoever is running the code surfaces that URL to a human (Slack DM, chat reply, ticket, email), and the human approves out-of-band.`]}),`\n`]}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`You usually do not need to set this.`}),` If `,_jsx(_components.code,{children:`ZAPIER_APPROVAL_MODE`}),` (and the `,_jsx(_components.code,{children:`approvalMode`}),` option) are both unset, the SDK auto-picks based on the environment: `,_jsx(_components.code,{children:`poll`}),` when stdin and stdout are both interactive TTYs, and `,_jsx(_components.code,{children:`throw`}),` everywhere else (agents, servers, CI, anything piped).`]})}),`\n`,_jsx(_components.p,{children:`To override the auto-detected mode, set the env var:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`export`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` ZAPIER_APPROVAL_MODE`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`throw`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Or pass `,_jsx(_components.code,{children:`approvalMode`}),` when you create your SDK client. The constructor option wins over the env var, which wins over the auto-detected default.`]}),`\n`,_jsx(Heading,{level:`3`,id:`step-3-run-your-code`,children:`Step 3: Run your code`}),`\n`,_jsx(_components.p,{children:`Your existing calls work unchanged. When a call needs approval, the flow depends on the mode.`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Poll mode`}),` keeps the call alive while you approve in the browser:`]}),`\n`,_jsx(Mermaid,{chart:`sequenceDiagram\n actor You\n participant Script as Your script\n participant Zapier\n participant Browser\n\n Script->>Zapier: Request\n Zapier->>Browser: Approval page opens\n Browser->>You: \"Allow access to Slack?\"\n You->>Browser: Click Approve\n Script->>Zapier: Retries the request\n Zapier->>Script: Returns result`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Throw mode`}),` hands the approval URL off to a human and lets the runner retry later:`]}),`\n`,_jsx(Mermaid,{chart:`sequenceDiagram\n actor You\n participant Agent\n participant Browser as Approval page\n\n You->>Agent: \"What is on my calendar?\"\n Agent->>You: \"I need your approval: \u003capprovalUrl>\"\n You->>Browser: Open URL, click Approve\n You->>Agent: \"Approved, try again\"\n Agent->>You: \"You have a meeting at 3pm...\"`}),`\n`,_jsxs(_components.p,{children:[`In throw mode, your agent only needs to do one thing: catch `,_jsx(_components.code,{children:`ZapierApprovalError`}),` and surface `,_jsx(_components.code,{children:`err.approvalUrl`}),` to whoever is supervising it.`]}),`\n`,_jsx(Heading,{level:`2`,id:`what-it-does-not-do`,children:`What it does not do`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Not admin-level access control.`}),` Permissions are guardrails on your own credentials, not an org-wide policy system. Other people on your team cannot be governed through your policy.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Only OAuth Client Credentials.`}),` Permission enforcement applies to SDK clients authenticated via Client Credentials. Clients using other auth methods bypass policies entirely.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Tables are not enrolled yet.`}),` Calls through the SDK’s Tables surface are not gated by approvals today, even when the rest of the connection is.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`next-steps`,children:`Next Steps`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/sdk/quickstart`,children:`Quickstart`}),`: install and authenticate before working through this page.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/sdk/using-the-cli`,children:`Using the CLI`}),`: explore and run actions from the terminal.`]}),`\n`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Permissions","description":"Build up a permission policy for your SDK clients as your code does new things","tag":"Experimental","href":"/sdk/permissions"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"What It Is","slug":"what-it-is","depth":2,"children":[]},{"title":"Why Use It","slug":"why-use-it","depth":2,"children":[]},{"title":"How to Use It","slug":"how-to-use-it","depth":2,"children":[{"title":"Step 1: Authenticate with approvals enabled","slug":"step-1-authenticate-with-approvals-enabled","depth":3,"children":[]},{"title":"Step 2: Pick an approval mode","slug":"step-2-pick-an-approval-mode","depth":3,"children":[]},{"title":"Step 3: Run your code","slug":"step-3-run-your-code","depth":3,"children":[]}]},{"title":"What it does not do","slug":"what-it-does-not-do","depth":2,"children":[]},{"title":"Next Steps","slug":"next-steps","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/zapier-82f0e938/f426fe1f80e04ec5/content/welcome.js","/_mintlify/custom/zapier-82f0e938/8e22ee5176c0f2d3/content/page-view.js","/_mintlify/custom/zapier-82f0e938/ba23268896a334a3/content/events-core.js","/_mintlify/custom/zapier-82f0e938/a4a4aa1a440a45f6/content/webmcp.js","/_mintlify/custom/zapier-82f0e938/00b5c2b78afe2715/logo-nav.js","/_mintlify/custom/zapier-82f0e938/4312bb950916a05a/universal-footer.js"],"subdomain":"zapier-82f0e938","siteName":"Zapier","title":"Permissions - Zapier","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-09-28T14:55:11.483Z","gitLastModified":"2026-09-28T14:54:36.000Z","originalFileLocation":"sdk/permissions.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Build up a permission policy for your SDK clients as your code does new things\">\u003cmeta data-mint-head name=\"application-name\" content=\"Zapier\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/zapier-82f0e938/YBlPOOl2M7kSqqiA/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/zapier-82f0e938/YBlPOOl2M7kSqqiA/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/zapier-82f0e938/YBlPOOl2M7kSqqiA/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/zapier-82f0e938/YBlPOOl2M7kSqqiA/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/zapier-82f0e938/YBlPOOl2M7kSqqiA/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/zapier-82f0e938/YBlPOOl2M7kSqqiA/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/zapier-82f0e938/YBlPOOl2M7kSqqiA/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/zapier-82f0e938/YBlPOOl2M7kSqqiA/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/zapier-82f0e938/YBlPOOl2M7kSqqiA/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Permissions - Zapier\">\u003cmeta data-mint-head property=\"og:description\" content=\"Build up a permission policy for your SDK clients as your code does new things\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Zapier\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.zapier.com/sdk/permissions\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://zapier-82f0e938.mintlify.app/_mintlify/api/og/v2?division=Getting+Started\u0026amp;title=Permissions\u0026amp;description=Build+up+a+permission+policy+for+your+SDK+clients+as+your+code+does+new+things\u0026amp;theme=d7e460cb9cc5ba95e728a619\u0026amp;signature=9a4e34a7500b3fac46fb3a5423549a0abd847bf5bb12bf78686b7167a7566ad9\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Permissions - Zapier\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Build up a permission policy for your SDK clients as your code does new things\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://zapier-82f0e938.mintlify.app/_mintlify/api/og/v2?division=Getting+Started\u0026amp;title=Permissions\u0026amp;description=Build+up+a+permission+policy+for+your+SDK+clients+as+your+code+does+new+things\u0026amp;theme=d7e460cb9cc5ba95e728a619\u0026amp;signature=9a4e34a7500b3fac46fb3a5423549a0abd847bf5bb12bf78686b7167a7566ad9\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/zapier-82f0e938/YBlPOOl2M7kSqqiA/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Zapier\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#FF4F00\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.zapier.com/sdk/permissions\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/sdk/permissions.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.zapier.com/#organization\",\"name\":\"Zapier\",\"url\":\"https://docs.zapier.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/zapier-82f0e938/uPbDC0jSuXgHCaWD/logo/light.svg?fit=max\u0026auto=format\u0026n=uPbDC0jSuXgHCaWD\u0026q=85\u0026s=b6a37289cb22ac1a9681572651874765\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.zapier.com#website\",\"name\":\"Zapier\",\"url\":\"https://docs.zapier.com\",\"publisher\":{\"@id\":\"https://docs.zapier.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.zapier.com/sdk/permissions#webpage\",\"url\":\"https://docs.zapier.com/sdk/permissions\",\"name\":\"Permissions\",\"description\":\"Build up a permission policy for your SDK clients as your code does new things\",\"dateModified\":\"2026-09-28T14:54:36.000Z\",\"isPartOf\":{\"@id\":\"https://docs.zapier.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.zapier.com/sdk/permissions#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.zapier.com/sdk/permissions#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Getting Started\",\"item\":\"https://docs.zapier.com/sdk/index\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Permissions\",\"item\":\"https://docs.zapier.com/sdk/permissions\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.zapier.com/sdk/permissions#article\",\"headline\":\"Permissions\",\"name\":\"Permissions\",\"description\":\"Build up a permission policy for your SDK clients as your code does new things\",\"url\":\"https://docs.zapier.com/sdk/permissions\",\"mainEntityOfPage\":{\"@id\":\"https://docs.zapier.com/sdk/permissions#webpage\"},\"dateModified\":\"2026-09-28T14:54:36.000Z\",\"publisher\":{\"@id\":\"https://docs.zapier.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.zapier.com#website\"}}]}\u003c/script>","siteName":"Zapier","nav":{"global":{"anchors":[{"anchor":"Community","icon":"users","href":"https://community.zapier.com/"},{"anchor":"Changelog","icon":"rss","href":"/white-label/changelog"},{"anchor":"Contact Us","icon":"envelope","href":"https://developer.zapier.com/contact"}]},"tabs":[{"tab":"Home","hidden":true,"searchable":true,"pages":[{"title":"Home","href":""}]},{"tab":"Use Zapier in your tools","menu":[{"item":"Install Zapier","description":"Gets you to a first action. Zapier MCP by default, with the SDK and CLI as alternatives.","pages":[{"title":"Install Zapier","href":"/install"}]},{"item":"Zapier MCP","description":"Connect from inside your AI client. Your agent runs actions across 9,000+ apps.","pages":[{"title":"Zapier MCP","href":"/mcp/home"}]},{"item":"Zapier SDK","description":"TypeScript for code projects, with OAuth and retries handled. Open beta.","groups":[{"group":"Getting Started","pages":[{"title":"Zapier SDK: TypeScript SDK for 9,000+ app integrations","sidebarTitle":"Zapier SDK","href":"/sdk"},{"title":"Zapier SDK quickstart: TypeScript setup for Node.js 20+","sidebarTitle":"Quickstart","href":"/sdk/quickstart"},{"title":"Zapier CLI: terminal interface for 9,000+ authenticated APIs","sidebarTitle":"Using the CLI","href":"/sdk/using-the-cli"},{"title":"Deploy","href":"/sdk/deploy"},{"title":"Using Triggers","description":"Triggers let your code react to real-time events across 9,000+ Zapier-connected apps (a new GitHub issue, an incoming Slack message, a row added to Google Sheets) without managing subscription state or worrying about the reliability of webhook consumers.","href":"/sdk/using-triggers"},{"title":"Permissions","tag":"Experimental","href":"/sdk/permissions"}]},{"group":"Reference","pages":[{"title":"Zapier SDK API reference: methods, types, and authentication","sidebarTitle":"API reference","description":"Full API reference for the Zapier TypeScript SDK. Covers Apps, Connections, Actions, Triggers, Tables, Workflows, HTTP Requests, and Account methods.","href":"/sdk/reference"},{"title":"CLI Reference","href":"/sdk/cli-reference"},{"title":"Changelog","href":"/sdk/changelog"}]}]},{"item":"Proxy API","description":"Make authenticated HTTP requests to any app API through Zapier.","pages":[{"title":"Proxy API","href":"/proxy-api/overview"}]},{"item":"Zapier Connectors","description":"Ready-made toolkits your agent can use, one per app. Prototype.","pages":[{"title":"Zapier Connectors","href":"/connectors/overview"}]}]},{"tab":"Build a Zapier integration","menu":[{"item":"Developer Platform","description":"Build a private integration for your own team, or a public one for the App Directory.","pages":[{"title":"Developer Platform","href":"/integrations"}]}],"pages":[{"title":"Build a Zapier integration","href":"/integrations"}]},{"tab":"Embed Zapier","menu":[{"item":"Powered by Zapier","description":"Embed Zapier. Users pay Zapier directly.","pages":[{"title":"Powered by Zapier","href":"/powered-by-zapier"}]},{"item":"White Label","description":"Native automation. No user Zapier account; your product pays Zapier.","pages":[{"title":"White Label","href":"/white-label/getting-started"}]}],"pages":[{"title":"Embed Zapier","href":"/powered-by-zapier"}]},{"tab":"API reference","pages":[{"title":"API reference","href":"/api-reference/overview"}]}]},"title":"Permissions - Zapier","buildId":"dpl_EnxDqhjaNc9a8MVa833TGULPd9uJ","deploymentId":"dpl_EnxDqhjaNc9a8MVa833TGULPd9uJ","dynamics":[],"chunks":[]}