<!doctype html><html lang=en dir=ltr class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-authentication/installing-with-oauth" data-has-hydrated=false><head><meta charset=UTF-8><meta name=generator content="Docusaurus v3.10.2"><title data-rh=true>Installing with OAuth | Slack Developer Docs</title><meta data-rh=true name=viewport content="width=device-width, initial-scale=1.0"/><meta data-rh=true name=twitter:card content=summary_large_image /><meta data-rh=true property=og:url content=https://docs.slack.dev/authentication/installing-with-oauth /><meta data-rh=true property=og:locale content=en /><meta data-rh=true name=docusaurus_locale content=en /><meta data-rh=true name=docsearch:language content=en /><meta data-rh=true name=docusaurus_version content=current /><meta data-rh=true name=docusaurus_tag content=docs-default-current /><meta data-rh=true name=docsearch:version content=current /><meta data-rh=true name=docsearch:docusaurus_tag content=docs-default-current /><meta data-rh=true property=og:title content="Installing with OAuth | Slack Developer Docs"/><meta data-rh=true name=description content='Slack apps are installed with a v2 OAuth 2.0 flow. We&apos;re sorry about all the "2s": OAuth 2.0 refers to the 2.0 version of the OAuth spec, and this is our second version of OAuth 2.0. For the rest of this guide, we&apos;ll just refer to it as "OAuth".'/><meta data-rh=true property=og:description content='Slack apps are installed with a v2 OAuth 2.0 flow. We&apos;re sorry about all the "2s": OAuth 2.0 refers to the 2.0 version of the OAuth spec, and this is our second version of OAuth 2.0. For the rest of this guide, we&apos;ll just refer to it as "OAuth".'/><link data-rh=true rel=icon href=/img/logos/favicon.ico /><link data-rh=true rel=canonical href=https://docs.slack.dev/authentication/installing-with-oauth /><link data-rh=true rel=alternate href=https://docs.slack.dev/authentication/installing-with-oauth hreflang=en /><link data-rh=true rel=alternate href=https://docs.slack.dev/authentication/installing-with-oauth hreflang=x-default /><script data-rh=true type=application/ld+json>{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","item":"https://docs.slack.dev/authentication/","name":"Authentication","position":1},{"@type":"ListItem","item":"https://docs.slack.dev/authentication/installing-with-oauth","name":"Installing with OAuth","position":2}]}</script><link rel=alternate type=application/rss+xml href=/changelog/rss.xml title="Slack Developer Docs RSS Feed"><link rel=alternate type=application/atom+xml href=/changelog/atom.xml title="Slack Developer Docs Atom Feed"><script>function gtag(){dataLayer.push(arguments)}function OptanonWrapper(){var a=OptanonActiveGroups.includes(",2,");gtag("consent","update",{analytics_storage:a?"granted":"denied"}),dataLayer.push({event:"OneTrustGroupsUpdated",OnetrustActiveGroups:OptanonActiveGroups,analyticsConsent:a?"granted":"denied"})}window.dataLayer=window.dataLayer||[],gtag("consent","default",{analytics_storage:"denied"})</script><link rel=preconnect href=https://www.googletagmanager.com><script>window.dataLayer=window.dataLayer||[],function(e,t,a,n,r){e[n]=e[n]||[],e[n].push({"gtm.start":new Date().getTime(),event:"gtm.js"});var d=t.getElementsByTagName(a)[0],g=t.createElement(a);g.async=!0,g.src="https://www.googletagmanager.com/gtm.js?id="+r+("dataLayer"!=n?"&l="+n:""),d.parentNode.insertBefore(g,d)}(window,document,"script","dataLayer","GTM-TVQFL84W")</script><meta name=google-site-verification content=d1jXBEojz0KFbjvsojJJ77KWTOf_8sIb3T32nAQY0ak><link rel=alternate type=text/plain title=llms.txt href=/llms.txt><script src=https://d34u8crftukxnk.cloudfront.net/onetrust/slack.dev/production/scripttemplates/otSDKStub.js type=text/javascript charset=UTF-8 data-domain-script=0198614a-ba8b-77a9-8d49-cfaf177eabd7></script><link rel=stylesheet href=/assets/css/styles.911d2e9f.css /><script src=/assets/js/runtime~main.050dfad6.js defer></script><script src=/assets/js/main.4ba3f33c.js defer></script></head><body><svg style="display: none;"><defs>
<symbol id=theme-svg-external-link viewBox="0 0 24 24"><path fill=currentColor d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
</defs></svg>
<script>!function(){var t=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",t||"light"),document.documentElement.setAttribute("data-theme-choice",t||"light")}(),function(){try{for(var[t,e]of new URLSearchParams(window.location.search).entries())if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script>

<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-TVQFL84W" height=0 width=0 style=display:none;visibility:hidden></iframe></noscript><div id=__docusaurus><link rel=preload as=image href=/img/logos/logo-light.svg /><link rel=preload as=image href=/img/logos/logo-dark.svg /><div style=display:none aria-hidden=true><div data-pagefind-filter=content_type>guide</div></div><div role=region aria-label="Skip to main content"><a class=skipToContent_fXgn href=#__docusaurus_skipToContent_fallback>Skip to main content</a></div><nav aria-label=Main class="theme-layout-navbar navbar navbar--fixed-top"><div class=navbar__inner><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded=false class="navbar__toggle clean-btn" type=button><svg width=30 height=30 viewBox="0 0 30 30" aria-hidden=true><path stroke=currentColor stroke-linecap=round stroke-miterlimit=10 stroke-width=2 d="M4 7h22M4 15h22M4 23h22"/></svg></button><a class=navbar__brand target=_self href=/><div class=navbar__logo><img src=/img/logos/logo-light.svg alt="Slack Developer Docs" class="themedComponent_mlkZ themedComponent--light_NVdE"/><img src=/img/logos/logo-dark.svg alt="Slack Developer Docs" class="themedComponent_mlkZ themedComponent--dark_xIcU"/></div></a><a aria-current=page class="navbar__item navbar__link navbar__link--active" target=_self href=/>Guides</a><a class="navbar__item navbar__link" target=_self href=/reference>Reference</a><a class="navbar__item navbar__link" target=_self href=/samples>Samples</a><a class="navbar__item navbar__link" target=_self href=/tools>Tools</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a class="navbar__item navbar__link" target=_self href=/changelog>Changelog</a><a href=https://api.slack.com/developer-program target=_blank rel="noopener noreferrer" class="navbar__item navbar__link">Dev Program</a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type=button disabled title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width=24 height=24 aria-hidden=true class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill=currentColor d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"/></svg><svg viewBox="0 0 24 24" width=24 height=24 aria-hidden=true class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill=currentColor d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"/></svg><svg viewBox="0 0 24 24" width=24 height=24 aria-hidden=true class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill=currentColor d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"/></svg></button></div><div class=navbar__search-wrapper><div class=navbar__search><div style="position:relative;padding:0 0.5rem"><div style=position:relative;display:inline-block><input type=text placeholder="Search docs" class="pagefind-custom-input pagefind-navbar-input" value="" /></div></div></div><a href=https://api.slack.com/apps target=_blank rel="noopener noreferrer" class="navbar-manage-apps-button outlined-button manage-apps-link">MANAGE APPS</a></div></div></div><div role=presentation class=navbar-sidebar__backdrop></div></nav><div id=__docusaurus_skipToContent_fallback class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class=docsWrapper_hBAB><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type=button></button><div class=docRoot_UBD9><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class=sidebarViewport_aRkj><div class=sidebar_njMd><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class=menu__link href=/><span class=linkLabel_WmDU>Welcome!</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class=menu__link href=/quickstart><span class=linkLabel_WmDU>Quickstart</span></a><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist" href=/developer-support><span class=categoryLinkLabel_W154>Resources</span></a><button aria-label="Expand sidebar category 'Resources'" aria-expanded=false type=button class="clean-btn menu__caret"></button></div><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1"><hr/><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist" href=/concepts/overview><span class=categoryLinkLabel_W154>Slack platform concepts</span></a><button aria-label="Expand sidebar category 'Slack platform concepts'" aria-expanded=false type=button class="clean-btn menu__caret"></button></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist" href=/ai/><span class=categoryLinkLabel_W154>AI in Slack</span></a><button aria-label="Expand sidebar category 'AI in Slack'" aria-expanded=false type=button class="clean-btn menu__caret"></button></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist" href=/apis/><span class=categoryLinkLabel_W154>APIs</span></a><button aria-label="Expand sidebar category 'APIs'" aria-expanded=false type=button class="clean-btn menu__caret"></button></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist" href=/app-management/><span class=categoryLinkLabel_W154>App management</span></a><button aria-label="Expand sidebar category 'App management'" aria-expanded=false type=button class="clean-btn menu__caret"></button></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist" href=/app-manifests/><span class=categoryLinkLabel_W154>App manifests</span></a><button aria-label="Expand sidebar category 'App manifests'" aria-expanded=false type=button class="clean-btn menu__caret"></button></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist" href=/admins/><span class=categoryLinkLabel_W154>Admin resources</span></a><button aria-label="Expand sidebar category 'Admin resources'" aria-expanded=false type=button class="clean-btn menu__caret"></button></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--active" href=/authentication/><span class=categoryLinkLabel_W154>Authentication</span></a><button aria-label="Collapse sidebar category 'Authentication'" aria-expanded=true type=button class="clean-btn menu__caret"></button></div><ul class=menu__list><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link tabindex=0 href=/authentication/><span class=linkLabel_WmDU>Overview</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link tabindex=0 href=/authentication/tokens><span class=linkLabel_WmDU>Tokens</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link menu__link--active" aria-current=page tabindex=0 href=/authentication/installing-with-oauth><span class=linkLabel_WmDU>Installing with OAuth</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link tabindex=0 href=/authentication/using-token-rotation><span class=linkLabel_WmDU>Using token rotation</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link tabindex=0 href=/authentication/using-pkce><span class=linkLabel_WmDU>Using PKCE</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link tabindex=0 href=/authentication/verifying-requests-from-slack><span class=linkLabel_WmDU>Verifying requests from Slack</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link tabindex=0 href=/authentication/authorizing-with-postman><span class=linkLabel_WmDU>Authorizing with Postman</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link tabindex=0 href=/authentication/binding-accounts-across-services><span class=linkLabel_WmDU>Binding accounts across services</span></a><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist" tabindex=0 href=/authentication/sign-in-with-slack/><span class=categoryLinkLabel_W154>Sign in with Slack</span></a><button aria-label="Expand sidebar category 'Sign in with Slack'" aria-expanded=false type=button class="clean-btn menu__caret"></button></div></ul><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist" href=/block-kit/><span class=categoryLinkLabel_W154>Block Kit</span></a><button aria-label="Expand sidebar category 'Block Kit'" aria-expanded=false type=button class="clean-btn menu__caret"></button></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist" href=/enterprise/><span class=categoryLinkLabel_W154>Enterprise</span></a><button aria-label="Expand sidebar category 'Enterprise'" aria-expanded=false type=button class="clean-btn menu__caret"></button></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist" href=/enterprise-search/><span class=categoryLinkLabel_W154>Enterprise Search for apps</span></a><button aria-label="Expand sidebar category 'Enterprise Search for apps'" aria-expanded=false type=button class="clean-btn menu__caret"></button></div><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class=menu__link href=/govslack><span class=linkLabel_WmDU>GovSlack</span></a><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist" href=/interactivity/><span class=categoryLinkLabel_W154>Interactivity</span></a><button aria-label="Expand sidebar category 'Interactivity'" aria-expanded=false type=button class="clean-btn menu__caret"></button></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist" href=/messaging/><span class=categoryLinkLabel_W154>Messaging</span></a><button aria-label="Expand sidebar category 'Messaging'" aria-expanded=false type=button class="clean-btn menu__caret"></button></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist" href=/slack-marketplace/><span class=categoryLinkLabel_W154>Slack Marketplace</span></a><button aria-label="Expand sidebar category 'Slack Marketplace'" aria-expanded=false type=button class="clean-btn menu__caret"></button></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist" href=/surfaces/><span class=categoryLinkLabel_W154>Surfaces</span></a><button aria-label="Expand sidebar category 'Surfaces'" aria-expanded=false type=button class="clean-btn menu__caret"></button></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist" href=/workflows/><span class=categoryLinkLabel_W154>Workflows</span></a><button aria-label="Expand sidebar category 'Workflows'" aria-expanded=false type=button class="clean-btn menu__caret"></button></div><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1"><hr/><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist" href=/legacy/><span class=categoryLinkLabel_W154>Legacy</span></a><button aria-label="Expand sidebar category 'Legacy'" aria-expanded=false type=button class="clean-btn menu__caret"></button></div><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1"><hr/><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist" href=/ja-jp/><span class=categoryLinkLabel_W154>日本語版ページ</span></a><button aria-label="Expand sidebar category '日本語版ページ'" aria-expanded=false type=button class="clean-btn menu__caret"></button></div></ul></nav><button type=button title="Collapse sidebar" aria-label="Collapse sidebar" class="button button--secondary button--outline collapseSidebarButton_PEFL"><svg width=20 height=20 aria-hidden=true class=collapseSidebarButtonIcon_kv0_><g fill=#7a7a7a><path d="M9.992 10.023c0 .2-.062.399-.172.547l-4.996 7.492a.982.982 0 01-.828.454H1c-.55 0-1-.453-1-1 0-.2.059-.403.168-.551l4.629-6.942L.168 3.078A.939.939 0 010 2.528c0-.548.45-.997 1-.997h2.996c.352 0 .649.18.828.45L9.82 9.472c.11.148.172.347.172.55zm0 0"/><path d="M19.98 10.023c0 .2-.058.399-.168.547l-4.996 7.492a.987.987 0 01-.828.454h-3c-.547 0-.996-.453-.996-1 0-.2.059-.403.168-.551l4.625-6.942-4.625-6.945a.939.939 0 01-.168-.55 1 1 0 01.996-.997h3c.348 0 .649.18.828.45l4.996 7.492c.11.148.168.347.168.55zm0 0"/></g></svg></button></div></div></aside><main class=docMainContainer_TBSr><div class="container padding-top--md padding-bottom--lg"><div class=row><div class="col docItemCol_VOVn"><div class=docItemContainer_Djhp><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_TYmE" aria-label=Breadcrumbs><ul class=breadcrumbs><li class=breadcrumbs__item><a aria-label="Home page" class=breadcrumbs__link href=/><svg viewBox="0 0 24 24" class=breadcrumbHomeIcon_YNFT><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill=currentColor /></svg></a><li class=breadcrumbs__item><a class=breadcrumbs__link href=/authentication/><span>Authentication</span></a><li class="breadcrumbs__item breadcrumbs__item--active"><span class=breadcrumbs__link>Installing with OAuth</span></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type=button class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Installing with OAuth</h1></header>
<p>Slack apps are installed with a v2 OAuth 2.0 flow. We're sorry about all the "2s": OAuth 2.0 refers to the <a href=https://oauth.net/2/ target=_blank rel="noopener noreferrer" class="">2.0 version of the OAuth spec</a>, and this is our second version of OAuth 2.0. For the rest of this guide, we'll just refer to it as "OAuth".</p>
<p>For posterity, this OAuth flow works the same as the OAuth flow for legacy Slack apps. Only a few details have changed; URL and method names have gained a <code>v2</code>, and the shape of the OAuth access response now puts bot access tokens first. We created a version 2 of the OAuth flow because it provides more granular Slack scopes, especially for bot users. Your app can act with its own identity, instead of acting on behalf of users — all without requesting excessive permissions that could cause installations to be rejected.</p>
<hr/>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=how>How it works: a high-level overview<a href=#how class=hash-link aria-label="Direct link to How it works: a high-level overview" title="Direct link to How it works: a high-level overview" translate=no>​</a></h2>
<p>OAuth allows a user in any Slack workspace to install your app. At the end of the OAuth flow, your app gains an access token. Your app's access token opens the door to <a class="" href=/apis/web-api/>Slack API methods</a>, <a class="" href=/apis/events-api/>events</a>, and <a class="" href=/interactivity>other features</a>. During the OAuth flow, you specify which <a class="" href=/reference/scopes>scopes</a> your app needs. Those scopes determine exactly which doors your app can open.</p>
<p>Implementing an OAuth flow can feel hard because there are a lot of steps, but your app really only has to worry about three steps to make OAuth work: <a href=#asking class="">requesting</a> scopes, <a href=#waiting class="">waiting</a> for a user to give their approval, and <a href=#exchanging class="">exchanging</a> a temporary authorization code for an access token. Redirecting a user to Slack can be done with a single link. For example:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#F8F8F2;--prism-background-color:#282A36><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-text codeBlock_bY9V thin-scrollbar" style=color:#F8F8F2;background-color:#282A36><code class=codeBlockLines_e6Vv><div class=token-line style=color:#F8F8F2><span class="token plain">[Add to Slack](https://slack.com/oauth/v2/authorize?scope=incoming-webhook&client_id=33336676.569200954261)</span><br/></div></code></pre></div></div>
<p>Replace the <code>client_id</code> with your app's client ID, and add the scopes you'd like. Bot scopes should be added as <code>scope=&lt;bot_scope></code>, and user scopes should be added as <code>user_scope=&lt;user_scope></code>.</p>
<p>For example, if your app only has one bot scope and it is <code>incoming-webhook</code>, the redirect would look like that shown above. If your app has a user scope, it might look like this instead:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#F8F8F2;--prism-background-color:#282A36><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-text codeBlock_bY9V thin-scrollbar" style=color:#F8F8F2;background-color:#282A36><code class=codeBlockLines_e6Vv><div class=token-line style=color:#F8F8F2><span class="token plain">https://slack.com/oauth/v2/authorize?user_scope=search%3Aread&client_id=33336676.569200954261</span><br/></div></code></pre></div></div>
<p>If your app has both a bot and a user scope, it might look like this:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#F8F8F2;--prism-background-color:#282A36><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-text codeBlock_bY9V thin-scrollbar" style=color:#F8F8F2;background-color:#282A36><code class=codeBlockLines_e6Vv><div class=token-line style=color:#F8F8F2><span class="token plain">https://slack.com/oauth/v2/authorize?scope=incoming-webhook&user_scope=search%3Aread&client_id=33336676.569200954261</span><br/></div></code></pre></div></div>
<hr/>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=obtaining>Obtaining access tokens with OAuth<a href=#obtaining class=hash-link aria-label="Direct link to Obtaining access tokens with OAuth" title="Direct link to Obtaining access tokens with OAuth" translate=no>​</a></h2>
<p>Your app obtains an access token in three steps:</p>
<ol>
<li class=""><a href=#asking class="">Requesting scopes</a>.</li>
<li class=""><a href=#waiting class="">Waiting for a user to approve your requested scopes</a>.</li>
<li class=""><a href=#exchanging class="">Exchanging a temporary authorization code for an access token</a>.</li>
</ol>
<p>Why is there a third exchanging step in OAuth at all? Why doesn't Slack send your app an access token directly after the user okays your app? The reason is <em>two-factor authentication</em>. You have to prove both that you have the right temporary authorization code, <em>and</em> that you have your app's client secret.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=asking>Requesting scopes<a href=#asking class=hash-link aria-label="Direct link to Requesting scopes" title="Direct link to Requesting scopes" translate=no>​</a></h3>
<p>While developing your app, you'll determine a minimum list of <a class="" href=/reference/scopes>scopes</a> that your app requires to work. When a user installs your app in their workspace, you'll request those scopes.</p>
<p>To request scopes, redirect Slack users to <code>https://slack.com/oauth/v2/authorize</code>. If you're developing a <a class="" href=/govslack>GovSlack</a> app for use by public sector customers, redirect users to <code>https://slack-gov.com/oauth/v2/authorize</code>.</p>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class=admonitionHeading_Gvgb><span class=admonitionIcon_Rf37><svg viewBox="0 0 16 16"><path fill-rule=evenodd d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"/></svg></span>A scope conflict occurs when attempting to combine <a class="" href=/authentication/sign-in-with-slack/>Sign in with Slack (SIWS)</a> user scopes with non-Sign in with Slack scopes in the same OAuth flow</div><div class=admonitionContent_BuS1><p>Each set of scopes must be requested in a separate OAuth flow.</div></div>
<p>Include both your app's client ID, which is found in the <a href=https://api.slack.com/apps target=_blank rel="noopener noreferrer" class=""><strong>App Management</strong></a> page, and a comma-separated list of scopes, such as: <code>scope=incoming-webhook,commands</code>. The full redirect URL will look something like this:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#F8F8F2;--prism-background-color:#282A36><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-text codeBlock_bY9V thin-scrollbar" style=color:#F8F8F2;background-color:#282A36><code class=codeBlockLines_e6Vv><div class=token-line style=color:#F8F8F2><span class="token plain">https://slack.com/oauth/v2/authorize?scope=incoming-webhook,commands&client_id=3336676.569200954261</span><br/></div></code></pre></div></div>
<p>The <code>scope</code> list requests scopes for your app's bot user. If you have specific need for a user token (for example, so that you can act on behalf of a user), provide a <code>user_scope</code> parameter with requested user scopes instead of, or in addition to, the <code>scope</code> parameter.</p>
<p>Also note that each installation can result in additive scopes. For example, if a user installs your app in a workspace where you request <code>channels:history</code> and then installs your app again where you request <code>channels:read</code>, both <code>channels:history</code> and <code>channels:read</code> will be assigned to the token. There is no way to remove scopes from an existing token without revoking it entirely.</p>
<p>When requesting scopes, you also need to tell Slack where to send your temporary authorization code afterward. Include a <code>redirect_uri</code> parameter in the URL above. The <code>redirect_uri</code> is where Slack will send the user back to, along with the temporary authorization code, once the user okays your app. The <code>redirect_uri</code> must use HTTPS. Alternatively, you can configure a Redirect URL in the <strong>App Management</strong> page under <strong>OAuth & Permissions</strong>. A Redirect URL must also use HTTPS.</p>
<p>When there are multiple Redirect URL values configured, the <code>redirect_url</code> parameter must be sent in both the <strong>Authorize</strong> and <strong>Access</strong> steps described below, and the parameter value must be the same for both steps — otherwise, you will encounter a <code>bad_redirect_uri</code> error:</p>
<ol>
<li class=""><strong>Authorize</strong>: You direct the user to the corresponding /oauth/v2/authorize path (this can be done with a link or button, for example). Send the <code>redirect_uri</code> in this step.</li>
<li class=""><strong>Redirect</strong>: Slack redirects the user to what was specified as the <code>redirect_uri</code> in the previous step, and adds a verification code to that URL.</li>
<li class=""><strong>Access</strong>: Your server retrieves the verification code from the previous step and sends it to the <a class="" href=/reference/methods/oauth.v2.access><code>oauth.v2.access</code></a> API endpoint to exchange that code for an access token.  If you sent a <code>redirect_uri</code> field in the first step, you must send that same field with the same value in this step.</li>
</ol>
<p>If there are multiple Redirect URL values configured, but no <code>redirect_uri</code> parameter is sent, the OAuth flow will use the first Redirect URL listed on the <strong>App Management</strong> page. You can use the <code>redirect_uri</code> parameter in your <code>oauth/v2/authorize</code> redirect as mentioned above and configure a Redirect URL in the <strong>App Management</strong> page. Your <code>redirect_uri</code> must match or be a subdirectory of a Redirect URL configured under <strong>App Management</strong>. A Redirect URL can <em>not</em> contain an anchor (<code>#</code>).</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#F8F8F2;--prism-background-color:#282A36><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-text codeBlock_bY9V thin-scrollbar" style=color:#F8F8F2;background-color:#282A36><code class=codeBlockLines_e6Vv><div class=token-line style=color:#F8F8F2><span class="token plain">REDIRECT_URL: https://example.com/path</span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain">GOOD redirect_uri: https://example.com/path</span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain">GOOD: https://example.com/path/subdir/other</span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain">BAD:  http://example.com/bar</span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain">BAD:  http://example.com/</span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain">BAD:  http://example.com:8080/path</span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain">BAD:  http://oauth.example.com:8080/path</span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain">BAD:  http://example.org</span><br/></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id=team>The <code>team</code> parameter<a href=#team class=hash-link aria-label="Direct link to team" title="Direct link to team" translate=no>​</a></h4>
<p>When a valid team ID is passed to <code>team</code> and the authenticating user is already signed in to that workspace, passing this parameter ensures the user will auth against that workspace.</p>
<p>If the user is not signed in yet, the user will be asked to specify a workspace to sign in to. That workspace will then be used as they complete the authorization flow, regardless of any <code>team</code> parameter you provided when the flow began.</p>
<p>If you omit the optional <code>team</code> parameter, the user will be allowed to choose which workspace they are authenticating against.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id=optional-scopes>Optional scopes<a href=#optional-scopes class=hash-link aria-label="Direct link to Optional scopes" title="Direct link to Optional scopes" translate=no>​</a></h4>
<p>Optional scopes allow you to mark certain permissions as optional during app configuration, giving users more control over what data your app can access while reducing installation abandonment.</p>
<p>You can designate scopes as optional in two ways: via the <a href=https://api.slack.com/apps target=_blank rel="noopener noreferrer" class="">app settings</a> or the app manifest.</p>
<ul>
<li class="">
<p><strong>App settings</strong>: In the app settings, uncheck the checkbox next to any scope you want to mark as optional.
<img decoding=async loading=lazy alt="optional scopes" src=/assets/images/optional_scopes-d8eb7bc28e26a2ae3300ee07ce69e4bd.png width=702 height=944 class=img_ev3q /></p>
</li>
<li class="">
<p><strong>App manifest</strong>: Add optional scopes to the <code>bot_optional</code> or <code>user_optional</code> <a class="" href=/reference/app-manifest#oauth>fields</a> within the <code>oauth_config.scopes</code> object. Optional scopes must also be listed in the corresponding bot or user fields.</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#F8F8F2;--prism-background-color:#282A36><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-json codeBlock_bY9V thin-scrollbar" style=color:#F8F8F2;background-color:#282A36><code class=codeBlockLines_e6Vv><div class=token-line style=color:#F8F8F2><span class="token property">"oauth_config"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain">    </span><span class="token property">"scopes"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain">        </span><span class="token property">"bot"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain">            </span><span class="token string" style="color:rgb(255, 121, 198)">"commands"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain">            </span><span class="token string" style="color:rgb(255, 121, 198)">"chat:write"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain">            </span><span class="token string" style="color:rgb(255, 121, 198)">"chat:write.public"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain">            </span><span class="token string" style="color:rgb(255, 121, 198)">"metadata.message:read"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain">            </span><span class="token string" style="color:rgb(255, 121, 198)">"links:read"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain">            </span><span class="token string" style="color:rgb(255, 121, 198)">"assistant:write"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain">            </span><span class="token string" style="color:rgb(255, 121, 198)">"im:history"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain">            </span><span class="token string" style="color:rgb(255, 121, 198)">"reactions:write"</span><span class="token plain"></span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain">        </span><span class="token property">"bot_optional"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain">            </span><span class="token string" style="color:rgb(255, 121, 198)">"chat:write"</span><span class="token plain"></span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain">        </span><span class="token property">"user"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain">            </span><span class="token string" style="color:rgb(255, 121, 198)">"channels:history"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain">            </span><span class="token string" style="color:rgb(255, 121, 198)">"reactions:read"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain">            </span><span class="token string" style="color:rgb(255, 121, 198)">"reactions:write"</span><span class="token plain"></span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain">        </span><span class="token property">"user_optional"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain">            </span><span class="token string" style="color:rgb(255, 121, 198)">"reactions:write"</span><span class="token plain"></span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain">    </span><span class="token property">"redirect_urls"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain">        </span><span class="token string" style="color:rgb(255, 121, 198)">"https://example.com/slack/auth"</span><span class="token plain"></span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain">    </span><span class="token property">"token_management_enabled"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><br/></div></code></pre></div></div>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=waiting>Waiting for a user to approve your requested scopes<a href=#waiting class=hash-link aria-label="Direct link to Waiting for a user to approve your requested scopes" title="Direct link to Waiting for a user to approve your requested scopes" translate=no>​</a></h3>
<p>Good news! Your app doesn't really have to do <em>anything</em>.</p>
<p>Prepare for the return of a user by listening for HTTP requests at whatever Redirect URL you specified.</p>
<p><a href=#optional-scopes class="">Optional scopes</a> give end users visibility and control over what data an app can access from their account. During installation, users are presented with the optional scopes the admin has pre-approved and can choose which ones to grant. Apps should respect users' scope selections and handle the absence of ungranted scopes gracefully. Refer to the <a href=#handling-optional-scopes class="">Handling optional scopes in your app</a> section below for guidance.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=exchanging>Exchanging a temporary authorization code for an access token<a href=#exchanging class=hash-link aria-label="Direct link to Exchanging a temporary authorization code for an access token" title="Direct link to Exchanging a temporary authorization code for an access token" translate=no>​</a></h3>
<p>If all goes well, a user goes through the Slack app installation and okays your app with all the scopes it requests. Then, Slack redirects the user back to your specified Redirect URL.</p>
<p>Parse the HTTP request that lands at your Redirect URL for a <code>code</code> field. That's your temporary authorization code, which expires after ten minutes. Check the <code>state</code> parameter if you sent one along with your initial user redirect. If it doesn't match what you sent, consider the authorization a forgery.</p>
<p>Now, you just need to exchange the code for an access token. You'll do this by calling the <a class="" href=/reference/methods/oauth.v2.access><code>oauth.v2.access</code></a> method as follows:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#F8F8F2;--prism-background-color:#282A36><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-text codeBlock_bY9V thin-scrollbar" style=color:#F8F8F2;background-color:#282A36><code class=codeBlockLines_e6Vv><div class=token-line style=color:#F8F8F2><span class="token plain">curl -F code=1234 -F client_id=3336676.569200954261 -F client_secret=ABCDEFGH https://slack.com/api/oauth.v2.access</span><br/></div></code></pre></div></div>
<p>Once you complete your access call, Slack sends you an HTTP request response containing an access token. It looks something like this:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#F8F8F2;--prism-background-color:#282A36><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-json codeBlock_bY9V thin-scrollbar" style=color:#F8F8F2;background-color:#282A36><code class=codeBlockLines_e6Vv><div class=token-line style=color:#F8F8F2><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain">    </span><span class="token property">"ok"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain">    </span><span class="token property">"access_token"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"xoxb-17653672481-19874698323-pdFZKVeTuE8sk7oOcBrzbqgy"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain">    </span><span class="token property">"token_type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"bot"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain">    </span><span class="token property">"scope"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"commands,incoming-webhook"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain">    </span><span class="token property">"bot_user_id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"U0KRQLJ9H"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain">    </span><span class="token property">"app_id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"A0KRD7HC3"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain">    </span><span class="token property">"team"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain">        </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Slack Pickleball Team"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain">        </span><span class="token property">"id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"T9TK3CUKW"</span><span class="token plain"></span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain">    </span><span class="token property">"enterprise"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain">        </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"slack-pickleball"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain">        </span><span class="token property">"id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"E12345678"</span><span class="token plain"></span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain">    </span><span class="token property">"authed_user"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain">        </span><span class="token property">"id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"U1234"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain">        </span><span class="token property">"scope"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"chat:write"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain">        </span><span class="token property">"access_token"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"xoxp-1234"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain">        </span><span class="token property">"token_type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"user"</span><span class="token plain"></span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br/></div></code></pre></div></div>
<p>If you requested scopes for a user token, you'll find them with a user access token under the <code>authed_user</code> property.</p>
<p>One more suggestion: show the user a nice message once they are redirected and you successfully gain an access token — or, if there's been an error, report that error to the user. The reason the user is redirected back to your app at the end of OAuth is for transparency purposes: the user deserves to know the end of the story, whether your app was installed successfully or not.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id=handling-optional-scopes>Handling optional scopes in your app<a href=#handling-optional-scopes class=hash-link aria-label="Direct link to Handling optional scopes in your app" title="Direct link to Handling optional scopes in your app" translate=no>​</a></h4>
<p>Apps must demonstrate usage of all scopes (both required and optional) and handle the absence of optional scopes gracefully. When a user doesn't grant an optional scope, your app should still function for features that don't require it.</p>
<ul>
<li class=""><strong>Graceful degradation</strong>: Handle <code>missing_scope</code> API errors when optional scopes aren't granted.</li>
<li class=""><strong>Token scope storage</strong>: Store the granted scopes from the <code>oauth.v2.access</code> response to proactively show or hide features based on what the user has authorized.</li>
<li class=""><strong>Feature gating</strong>: Check token scopes before displaying functionality that requires optional permissions.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=v2-user-access>The user-centric flow: the <code>oauth.v2.user.access</code> method<a href=#v2-user-access class=hash-link aria-label="Direct link to v2-user-access" title="Direct link to v2-user-access" translate=no>​</a></h2>
<p>In addition to the standard workspace installation flow, Slack provides a dedicated flow for obtaining user-specific access tokens. To initiate a user-specific flow, redirect users to the <code>v2_user</code> authorization endpoint:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#F8F8F2;--prism-background-color:#282A36><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-text codeBlock_bY9V thin-scrollbar" style=color:#F8F8F2;background-color:#282A36><code class=codeBlockLines_e6Vv><div class=token-line style=color:#F8F8F2><span class="token plain">https://slack.com/oauth/v2_user/authorize?client_id=YOUR_CLIENT_ID&scope=chat:write,channels:history</span><br/></div></code></pre></div></div>
<p>Unlike the the standard <code>v2/authorize</code> endpoint, this flow focuses exclusively on the user's identity and personal permissions. After approval, Slack redirects back to your <code>redirect_uri</code> with a temporary <code>code</code>, just like the standard flow.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=exchanging-the-code-with-oauthv2useraccess>Exchanging the code with <code>oauth.v2.user.access</code><a href=#exchanging-the-code-with-oauthv2useraccess class=hash-link aria-label="Direct link to exchanging-the-code-with-oauthv2useraccess" title="Direct link to exchanging-the-code-with-oauthv2useraccess" translate=no>​</a></h3>
<p>Once you have the temporary authorization code, you must exchange it using the <a class="" href=/reference/methods/oauth.v2.user.access><code>oauth.v2.user.access</code></a> API method. This method is compliant to the OAuth 2.0 RFC.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=comparing-oauthv2access-and-oauthv2useraccess-endpoints>Comparing <code>oauth.v2.access</code> and <code>oauth.v2.user.access</code> endpoints<a href=#comparing-oauthv2access-and-oauthv2useraccess-endpoints class=hash-link aria-label="Direct link to comparing-oauthv2access-and-oauthv2useraccess-endpoints" title="Direct link to comparing-oauthv2access-and-oauthv2useraccess-endpoints" translate=no>​</a></h3>
<p>The <a class="" href=/reference/methods/oauth.v2.access><code>oauth.v2.access</code></a> API method supports generating either a bot token or user token or both.</p>
<p>The <a class="" href=/reference/methods/oauth.v2.user.access><code>oauth.v2.user.access</code></a> API method generates a user token by default following the standard OAuth spec and works out-of-the-box with <a class="" href=/ai/slack-mcp-server>MCP</a> authorization flows.</p>
<p>The <code>oauth.v2.user.access</code> endpoint should be used in scenarios where:</p>
<ul>
<li class="">You only need user tokens, not bot tokens</li>
<li class="">You're building <a class="" href=/ai/slack-mcp-server>MCP integrations</a> with desktop IDE clients like Cursor or Claude Code</li>
</ul>
<p>Use the <code>oauth.v2.access</code> API method unless your client cannot support passing <code>scope</code> and <code>scope_user</code> in the same request.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=appending_scopes>Appending scopes<a href=#appending_scopes class=hash-link aria-label="Direct link to Appending scopes" title="Direct link to Appending scopes" translate=no>​</a></h2>
<p>When you initially send a user through the OAuth flow, you receive a token that has the set of scopes you requested. Any subsequent time(s) you send that same user through the OAuth flow, any new scopes you request will be added to that initial set.</p>
<p>For example, if you initially request <code>channels:read</code> and <code>channels:write</code> from a user, the initial token will only be scoped to <code>channels:read channels:write</code> (plus <code>identify</code>, which is automatically included in any OAuth grant for a classic app). If you send that same user through a second OAuth flow, this time requesting <code>files:write</code>, the resulting token will have the new scope added to the previous set: <code>channels:read channels:write files:write identify</code>.</p>
<p>This process can be repeated any number of times, and each scope you request is <strong>additive</strong> to the scopes you've already been awarded. It is not possible to downgrade an access token's scopes.</p>
<p>As you make <a class="" href=/apis/web-api/>Web API</a> requests, a <code>x-oauth-scopes</code> HTTP header will be returned with every response indicating which scopes the calling token currently has:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#F8F8F2;--prism-background-color:#282A36><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-text codeBlock_bY9V thin-scrollbar" style=color:#F8F8F2;background-color:#282A36><code class=codeBlockLines_e6Vv><div class=token-line style=color:#F8F8F2><span class="token plain">x-oauth-scopes: identity.basic,reactions:read</span><br/></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=securing-connections>Securing OAuth connections for enterprise customers<a href=#securing-connections class=hash-link aria-label="Direct link to Securing OAuth connections for enterprise customers" title="Direct link to Securing OAuth connections for enterprise customers" translate=no>​</a></h2>
<p>When your app completes the OAuth flow with a Slack workspace, we strongly recommend verifying that the connecting user's account matches the enterprise customer's expected domain.</p>
<p>After exchanging the authorization code for an access token:</p>
<ul>
<li class="">Call the <code>team.info</code> and <code>users.info</code> API methods to retrieve the workspace's domain configuration.</li>
<li class="">Compare the domain on your side against the workspace's domain to ensure the user is connecting with their corporate account rather than a personal one.</li>
</ul>
<p>This prevents a scenario where an employee authenticates with a personal account and inadvertently links corporate Slack data to an unmanaged instance outside their organization's control.</p>
<p>Enterprise administrators expect that when they install your app on their workspace, employees will connect using corporate-managed accounts. Implementing this check at the end of your OAuth flow helps protect your enterprise customers' data and demonstrates that your integration meets the security expectations of organizations using Slack.</p>
<hr/>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=tokens>More about tokens<a href=#tokens class=hash-link aria-label="Direct link to More about tokens" title="Direct link to More about tokens" translate=no>​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=using>Using tokens<a href=#using class=hash-link aria-label="Direct link to Using tokens" title="Direct link to Using tokens" translate=no>​</a></h3>
<p>The best way to communicate your access tokens — also known as bearer tokens — to Slack is by presenting them in a request's <code>Authorization</code> HTTP header where the full value, including "Bearer", is case-sensitive. This approach is required when using <code>application/json</code> with a write method.</p>
<div class="language-no-highlight codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#F8F8F2;--prism-background-color:#282A36><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-no-highlight codeBlock_bY9V thin-scrollbar" style=color:#F8F8F2;background-color:#282A36><code class=codeBlockLines_e6Vv><div class=token-line style=color:#F8F8F2><span class="token plain">GET /api/conversations.list?limit=50</span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain">Authorization: Bearer xoxb-1234-abcdefgh</span><br/></div></code></pre></div></div>
<p>Alternatively, you may send the token as a POST body attribute of the <code>application/x-www-form-urlencoded</code> variety.</p>
<p>POST body:</p>
<div class="language-no-highlight codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#F8F8F2;--prism-background-color:#282A36><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-no-highlight codeBlock_bY9V thin-scrollbar" style=color:#F8F8F2;background-color:#282A36><code class=codeBlockLines_e6Vv><div class=token-line style=color:#F8F8F2><span class="token plain">POST /api/conversations.list</span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain">Content-type: application/x-www-form-urlencoded</span><br/></div><div class=token-line style=color:#F8F8F2><span class="token plain">token=xoxb-1234-abcdefgh&limit=50</span><br/></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=revoking>Revoking tokens<a href=#revoking class=hash-link aria-label="Direct link to Revoking tokens" title="Direct link to Revoking tokens" translate=no>​</a></h3>
<p>OAuth tokens do not expire. If they are no longer needed, they can be revoked. Revocation of an OAuth token happens if a workspace owner fully uninstalls the app, a user individually removes their configurations, or the account of the user who initially authenticated the Slack app is deactivated.</p>
<p>API access tokens are revoked via the <a class="" href=/reference/methods/auth.revoke><code>auth.revoke</code></a> method. After that happens:</p>
<ul>
<li class="">The bot token no longer works.</li>
<li class="">The bot user is removed from the workspace.</li>
<li class="">Slash commands associated with the bot token will be removed from the workspace if no user tokens for the same app exist and carry the <code>commands</code> scope.</li>
<li class="">Incoming webhooks that were installed and associated with the bot token will be removed.</li>
<li class="">If no user tokens for the same app exist, the app will appear to be uninstalled from the workspace.</li>
</ul>
<p>Additionally, for Slack apps using granular permissions, you can exchange your access token for a refresh token and an expiring access token with <a class="" href=/authentication/using-token-rotation>token rotation</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=storing>Storing tokens securely<a href=#storing class=hash-link aria-label="Direct link to Storing tokens securely" title="Direct link to Storing tokens securely" translate=no>​</a></h3>
<p>Store your application's credentials and user tokens with care. Restrict Web API access to only IP addresses you trust by allowlisting specific IP addresses. Read up on <a class="" href=/concepts/security>best practices for security</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=errors>Errors<a href=#errors class=hash-link aria-label="Direct link to Errors" title="Direct link to Errors" translate=no>​</a></h2>
<p>Below are some errors you may encounter and reasons for encountering them:</p>
<ul>
<li class=""><code>bad_redirect_uri</code>: Occurs when there are multiple <code>redirect_url</code> parameter values configured and they do not match.</li>
<li class=""><code>invalid_scope</code>: Occurs if requesting a non-existent scope or requesting a set of scopes that are in conflict with each other (e.g. SIWS user scopes cannot be combined with non-SIWS user scopes).</li>
<li class=""><code>invalid_team_for_non_distributed_app</code>: Occurs when attempting to install/authorize an undistributed Slack API app on a team where the app was not created.</li>
<li class=""><code>scope_not_allowed_on_enterprise</code>: Occurs when attempting to install an app in an Enterprise org containing scopes that are not org-compatible. See below for more details.</li>
<li class=""><code>unapproved_scope</code>: Occurs if attempting to install a published app for which the requested scopes aren't approved either because they're still in review for that app, or they weren't yet submitted for review by the app developer.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=non-enterprise-scopes>Non-Enterprise scopes<a href=#non-enterprise-scopes class=hash-link aria-label="Direct link to Non-Enterprise scopes" title="Direct link to Non-Enterprise scopes" translate=no>​</a></h3>
<p>The following is a list of scopes that are not org-compatible:</p>
<ul>
<li class=""><a class="" href=/reference/scopes/bot/>bot</a></li>
<li class=""><a class="" href=/reference/scopes/apps.requests.write/>apps.requests.write</a></li>
</ul></div></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href=/authentication/tokens><div class=pagination-nav__sublabel>Previous</div><div class=pagination-nav__label>Tokens</div></a><a class="pagination-nav__link pagination-nav__link--next" href=/authentication/using-token-rotation><div class=pagination-nav__sublabel>Next</div><div class=pagination-nav__label>Using token rotation</div></a></nav></div></div><div class="col col--3"><div class=toc-wrapper-custom><div class=toc-copy-container><div class=copy-button-container style=display:flex;justify-content:flex-start;margin-bottom:1rem><div class=copy-btn-group><button type=button class="minimal-text-btn copy-btn-main ">Copy as markdown</button><button type=button class="minimal-text-btn copy-btn-arrow" aria-label="More options"><svg width=10 height=6 viewBox="0 0 10 6" fill=none aria-hidden=true><path d="M1 1L5 5L9 1" stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round /></svg></button></div></div></div><div class=toc-scroll-area><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href=#how class="table-of-contents__link toc-highlight">How it works: a high-level overview</a><li><a href=#obtaining class="table-of-contents__link toc-highlight">Obtaining access tokens with OAuth</a><ul><li><a href=#asking class="table-of-contents__link toc-highlight">Requesting scopes</a><li><a href=#waiting class="table-of-contents__link toc-highlight">Waiting for a user to approve your requested scopes</a><li><a href=#exchanging class="table-of-contents__link toc-highlight">Exchanging a temporary authorization code for an access token</a></ul><li><a href=#v2-user-access class="table-of-contents__link toc-highlight">The user-centric flow: the <code>oauth.v2.user.access</code> method</a><ul><li><a href=#exchanging-the-code-with-oauthv2useraccess class="table-of-contents__link toc-highlight">Exchanging the code with <code>oauth.v2.user.access</code></a><li><a href=#comparing-oauthv2access-and-oauthv2useraccess-endpoints class="table-of-contents__link toc-highlight">Comparing <code>oauth.v2.access</code> and <code>oauth.v2.user.access</code> endpoints</a></ul><li><a href=#appending_scopes class="table-of-contents__link toc-highlight">Appending scopes</a><li><a href=#securing-connections class="table-of-contents__link toc-highlight">Securing OAuth connections for enterprise customers</a><li><a href=#tokens class="table-of-contents__link toc-highlight">More about tokens</a><ul><li><a href=#using class="table-of-contents__link toc-highlight">Using tokens</a><li><a href=#revoking class="table-of-contents__link toc-highlight">Revoking tokens</a><li><a href=#storing class="table-of-contents__link toc-highlight">Storing tokens securely</a></ul><li><a href=#errors class="table-of-contents__link toc-highlight">Errors</a><ul><li><a href=#non-enterprise-scopes class="table-of-contents__link toc-highlight">Non-Enterprise scopes</a></ul></ul></div></div></div></div></div></div></main></div></div></div><footer class="theme-layout-footer footer"><div class="container container-fluid"><div class="row footer__links"><div class="theme-layout-footer-column col footer__col"><div class=footer__title>.</div><ul class="footer__items clean-list"><li class=footer__item>
                    <a href=/ class="c-slackhash desktop" aria-label=Slack><svg width=54 viewBox="0 0 170 170" fill=none xmlns=http://www.w3.org/2000/svg><circle cx=85 cy=85 r=85 fill=#181818 /><path d="M170 85C170 38.0558 131.944 0 85 0V85H170Z" fill=#41B658 /><path d="M85 170C131.944 170 170 131.944 170 85L85 85L85 170Z" fill=#FCC003 /><path d="M0 85C0 131.944 38.0558 170 85 170L85 85L0 85Z" fill=#E3066A /><path d="M85 0C38.0558 0 0 38.0558 0 85L85 85L85 0Z" fill=#1AB9FF /><circle cx=84.9999 cy=84.9999 r=77.8505 fill=white /><path d="M136.881 111.624V116.652H108.146V111.624H136.881Z" fill=black /><path d="M95.239 116.919H91.1738L82.418 94.7607H88.0467L93.2846 109.61H93.4018L98.327 94.7607H104.034L95.239 116.919Z" fill=black /><path d="M80.6335 107.933H63.7863C64.1772 109.848 66.5616 112.389 69.7669 112.389C71.9167 112.389 73.7148 111.529 74.7702 109.614H80.2426C78.8354 113.992 74.3793 117.158 69.7669 117.158C63.2391 117.158 58.314 112.076 58.314 105.666C58.314 99.2554 63.1218 94.0176 69.7278 94.0176C76.021 94.0176 80.9462 98.9818 80.9462 105.314C80.9462 106.135 80.8289 106.995 80.6335 107.933ZM63.63 103.751H75.6301C75.122 100.624 72.9721 98.7864 69.7278 98.7864C66.8743 98.7864 64.4508 100.428 63.63 103.751Z" fill=black /><path d="M38.9577 116.92H32V87.9941H38.9187C43.8438 87.9941 48.6126 89.0886 51.4269 92.2939C54.7886 96.0854 55.2185 100.542 55.2185 102.183C55.2185 106.6 53.6941 110.079 51.466 112.503C48.6517 115.551 45.1337 116.92 38.9577 116.92ZM37.3551 111.916H39.075C42.9057 111.916 45.6809 110.9 47.4008 109.063C49.2771 107.069 49.8634 104.45 49.8634 102.535C49.8634 100.151 49.0035 97.8053 47.3227 95.9682C45.5637 94.0528 42.8666 92.9975 38.9187 92.9975H37.3551V111.916Z" fill=black /><path d="M137 82.1982H130.433L122.725 71.3487H122.647V82.1982H117.448L117.449 52H122.647L122.647 70.0197H122.725L129.644 59.8177H135.625L127.807 70.4497L137 82.1982Z" fill=black /><path d="M107.104 74.4369H112.967C111.13 79.4012 107.065 82.2155 102.101 82.2155C95.6902 82.2155 90.5696 76.9386 90.5696 70.5672C90.5696 64.313 95.6902 59.0752 102.062 59.0752C106.948 59.0752 111.286 62.0068 112.967 67.0101H107.104C105.97 64.9775 104.446 63.844 102.062 63.844C98.3873 63.844 95.7683 66.7756 95.7683 70.6454C95.7683 74.5151 98.5827 77.4467 102.296 77.4467C104.446 77.4467 106.01 76.1959 107.104 74.4369Z" fill=black /><path d="M86.3326 81.5119H81.5638V78.8148C79.8439 80.8474 76.6386 82.2155 73.9415 82.2155C67.8438 82.2155 63.4268 77.0949 63.4268 70.5281C63.4268 64.2349 68.0001 59.0752 74.2933 59.0752C77.3422 59.0752 80.352 60.8733 81.4856 62.5541H81.5638V59.8179H86.3326V81.5119ZM75.0751 77.4467C78.8667 77.4467 81.4074 74.3197 81.4074 70.6063C81.4074 66.8147 78.7885 63.844 75.036 63.844C71.4008 63.844 68.6255 66.8929 68.6255 70.7626C68.6255 74.3978 71.4008 77.4467 75.0751 77.4467Z" fill=black /><path d="M59.816 82.1982H54.7056V52H59.816V82.1982Z" fill=black /><path d="M50.0979 60.2477H44.6256V60.2086C44.4692 58.3323 43.4138 57.0033 41.3812 57.0033C39.7004 57.0033 38.4105 58.2151 38.4105 59.9349C38.4105 61.8112 39.6613 62.9057 42.1239 63.6093C48.2217 65.4073 50.8015 68.1435 50.8015 72.8732C50.8015 78.541 46.6972 82.0981 41.4203 82.0981C36.3779 82.0981 32.3127 78.4629 32 73.225H37.6287C37.9024 75.6094 39.3095 77.0948 41.4594 77.0948C43.6483 77.0948 45.4464 75.4921 45.4464 73.4204C45.4464 71.3097 44.0392 70.0588 41.733 69.238C37.1597 67.5963 33.0554 66.3064 33.0554 60.2477C33.0554 55.3225 36.9642 52 41.5376 52C45.9937 52 49.8243 55.3616 50.0979 60.2477Z" fill=black /></svg></a>
                  </ul></div><div class="theme-layout-footer-column col footer__col"><div class=footer__title>Tools</div><ul class="footer__items clean-list"><li class=footer__item><a class=footer__link-item href=/tools/slack-cli/>Slack CLI</a><li class=footer__item><a class=footer__link-item href=/tools/#bolt>Bolt frameworks</a><li class=footer__item><a class=footer__link-item href=/tools/#sdks>Slack SDKs</a><li class=footer__item><a href=https://app.slack.com/block-kit-builder/ target=_blank rel="noopener noreferrer" class=footer__link-item>Block Kit Builder</a><li class=footer__item><a href=https://api.slack.com/developer-program target=_blank rel="noopener noreferrer" class=footer__link-item>Developer program</a><li class=footer__item><a class=footer__link-item href=/samples/>Code samples & tutorials</a><li class=footer__item><a href=https://docs.slack.dev/llms.txt target=_blank rel="noopener noreferrer" class=footer__link-item>LLM? Read llms.txt</a><li class=footer__item><a class=footer__link-item href=/tools/>All tools</a></ul></div><div class="theme-layout-footer-column col footer__col"><div class=footer__title>Learn</div><ul class="footer__items clean-list"><li class=footer__item><a href=https://slack.dev/learning-paths/ target=_blank rel="noopener noreferrer" class=footer__link-item>Learning paths</a><li class=footer__item><a href=https://slack.dev/workshops target=_blank rel="noopener noreferrer" class=footer__link-item>Workshops</a><li class=footer__item><a href="https://trailheadacademy.salesforce.com/all-offerings#f-assetType=Certification&f-products=Slack&f-siteLanguage=en_US" target=_blank rel="noopener noreferrer" class=footer__link-item>Slack certifications</a><li class=footer__item><a href=https://trailhead.salesforce.com/ target=_blank rel="noopener noreferrer" class=footer__link-item>Trailhead</a><li class=footer__item><a href=https://slack.dev/resource-library target=_blank rel="noopener noreferrer" class=footer__link-item>Resource library</a><li class=footer__item><a href=https://slack.dev/learn target=_blank rel="noopener noreferrer" class=footer__link-item>All learning resources</a></ul></div><div class="theme-layout-footer-column col footer__col"><div class=footer__title>Community</div><ul class="footer__items clean-list"><li class=footer__item><a href=https://slack.dev/community target=_blank rel="noopener noreferrer" class=footer__link-item>Slack community</a><li class=footer__item><a href=https://slack.dev/events target=_blank rel="noopener noreferrer" class=footer__link-item>Slack events</a></ul></div><div class="theme-layout-footer-column col footer__col"><div class=footer__title>Resources</div><ul class="footer__items clean-list"><li class=footer__item><a class=footer__link-item href=/>Docs</a><li class=footer__item><a href=https://slack.dev/blog target=_blank rel="noopener noreferrer" class=footer__link-item>Blog</a><li class=footer__item><a href=https://slack.com/marketplace target=_blank rel="noopener noreferrer" class=footer__link-item>Slack marketplace</a><li class=footer__item><a href=https://slack.dev/newsletter target=_blank rel="noopener noreferrer" class=footer__link-item>Developer newsletter</a></ul></div><div class="theme-layout-footer-column col footer__col"><div class=footer__title>Manage Apps</div><ul class="footer__items clean-list"><li class=footer__item><a href=https://api.slack.com/apps target=_blank rel="noopener noreferrer" class=footer__link-item>Your apps</a></ul></div></div><div class="footer__bottom text--center"><div class=footer__copyright><div class=footer__submenu>
          <div>
            <div class=legal-links>
              <ul class=legal_list aria-label="Legal links">
                <li><a href=https://slack-status.com/ rel="noopener noreferrer" target=_blank>Status</a></li>
                <li><a href=https://slack.com/trust/privacy/privacy-policy>Privacy</a></li>
                <li><a href=https://slack.com/terms-of-service/api target=_blank rel="noopener noreferrer">Terms</a></li>
                <li><a class=optanon-show-settings href=# data-preference-center="">Cookie Preferences</a></li>
                <li><a href=https://docs.slack.dev/developer-support rel="noopener noreferrer" target=_blank>Support</a></li>
                <li><a href=https://docs.slack.dev/changelog rel="noopener noreferrer" target=_blank>Changelog</a></li>
                <li><a class=privacy-choice href=https://www.salesforce.com/form/other/privacy-request/ aria-label="Your Privacy Choices" title="Your Privacy Choices" target=_blank rel=noopener><span>Your Privacy Choices</span><svg xmlns=http://www.w3.org/2000/svg xml:space=preserve width=30 height=14 style="enable-background:new 0 0 30 14"><path d="M7.4 12.8h6.8l3.1-11.6H7.4C4.2 1.2 1.6 3.8 1.6 7s2.6 5.8 5.8 5.8z" style=fill-rule:evenodd;clip-rule:evenodd;fill:#fff /><path d="M22.6 0H7.4c-3.9 0-7 3.1-7 7s3.1 7 7 7h15.2c3.9 0 7-3.1 7-7s-3.2-7-7-7zm-21 7c0-3.2 2.6-5.8 5.8-5.8h9.9l-3.1 11.6H7.4c-3.2 0-5.8-2.6-5.8-5.8z" style=fill-rule:evenodd;clip-rule:evenodd;fill:#06f /><path d="M24.6 4c.2.2.2.6 0 .8L22.5 7l2.2 2.2c.2.2.2.6 0 .8-.2.2-.6.2-.8 0l-2.2-2.2-2.2 2.2c-.2.2-.6.2-.8 0-.2-.2-.2-.6 0-.8L20.8 7l-2.2-2.2c-.2-.2-.2-.6 0-.8.2-.2.6-.2.8 0l2.2 2.2L23.8 4c.2-.2.6-.2.8 0z" style=fill:#fff /><path d="M12.7 4.1c.2.2.3.6.1.8L8.6 9.8c-.1.1-.2.2-.3.2-.2.1-.5.1-.7-.1L5.4 7.7c-.2-.2-.2-.6 0-.8.2-.2.6-.2.8 0L8 8.6l3.8-4.5c.2-.2.6-.2.9 0z" style=fill:#06f /></svg></a></li>
              </ul>
            </div>
            <small class=legal-text>© 2026 Slack Technologies, LLC, a Salesforce company. All rights reserved. Various trademarks held by their respective owners.</small>
          </div>
          <ul class=social_list>
            <li class=listitem-social>
              <a class=brand-linkedin aria-label=LinkedIn title=LinkedIn target=_blank rel=noopener href=https://www.linkedin.com/company/tiny-spec-inc/>
                <svg width=18 height=18 version=1 viewBox="0 0 18 18" xmlns=http://www.w3.org/2000/svg role=presentation><path d="M1.84613 3.69226C2.86519 3.69226 3.69226 2.86519 3.69226 1.84613C3.69226 0.827067 2.86519 0 1.84613 0C0.827067 0 0 0.827067 0 1.84613C0 2.86519 0.827067 3.69226 1.84613 3.69226ZM0 16V4.92317H3.69226V16H0ZM6.15441 4.92317H9.55991V6.66838H9.60916C10.0829 5.81794 11.2423 4.92317 12.9716 4.92317C16.5666 4.92317 17.2312 7.16068 17.2312 10.0714V16H13.6804V10.7446C13.6804 9.49173 13.6546 7.87821 11.8343 7.87821C9.98578 7.87821 9.70267 9.24311 9.70267 10.6536V16H6.15441V4.92317Z"/></svg>
              </a>
            </li>
            <li class=listitem-social>
              <a class=brand-bluesky aria-label=Bluesky title=Bluesky target=_blank rel=noopener href=https://bsky.app/profile/slack.dev>
                <svg xmlns=http://www.w3.org/2000/svg viewBox="0 -3.268 64 68.414" height=18 role=presentation><path d="M13.873 3.805C21.21 9.332 29.103 20.537 32 26.55v15.882c0-.338-.13.044-.41.867-1.512 4.456-7.418 21.847-20.923 7.944-7.111-7.32-3.819-14.64 9.125-16.85-7.405 1.264-15.73-.825-18.014-9.015C1.12 23.022 0 8.51 0 6.55 0-3.268 8.579-.182 13.873 3.805zm36.254 0C42.79 9.332 34.897 20.537 32 26.55v15.882c0-.338.13.044.41.867 1.512 4.456 7.418 21.847 20.923 7.944 7.111-7.32 3.819-14.64-9.125-16.85 7.405 1.264 15.73-.825 18.014-9.015C62.88 23.022 64 8.51 64 6.55c0-9.818-8.578-6.732-13.873-2.745z"/></svg>
              </a>
            </li>
            <li class=listitem-social>
              <a class=brand-youtube aria-label=YouTube title=YouTube target=_blank rel=noopener href=https://www.youtube.com/channel/UCY3YECgeBcLCzIrFLP4gblw>
                <svg width=18 height=18 viewBox="0 0 32 32" xmlns=http://www.w3.org/2000/svg role=presentation><path d=M29.41,9.26a3.5,3.5,0,0,0-2.47-2.47C24.76,6.2,16,6.2,16,6.2s-8.76,0-10.94.59A3.5,3.5,0,0,0,2.59,9.26,36.13,36.13,0,0,0,2,16a36.13,36.13,0,0,0,.59,6.74,3.5,3.5,0,0,0,2.47,2.47C7.24,25.8,16,25.8,16,25.8s8.76,0,10.94-.59a3.5,3.5,0,0,0,2.47-2.47A36.13,36.13,0,0,0,30,16,36.13,36.13,0,0,0,29.41,9.26ZM13.2,20.2V11.8L20.47,16Z /></svg>
              </a>
            </li>
          </ul>
        </div></div></div></div></footer></div></body>