Connect a third-party service to ModuleX with OAuth or your own key, then call its tool from a workflow. A step-by-step guide for connecting GitHub, Slack, and 175 other integrations.
ModuleX connects to 175 services — GitHub, Slack, Gmail, Notion, Salesforce, and many more — so your workflows can act on them: open an issue, send a message, read a row, create a contact. This guide walks you through it end to end: connect a service once, then call one of its actions from a tool node in a workflow.You connect a service once, for your whole organization. After that, every workflow and the Assistant can use it. For the bigger picture of what integrations are, start with the integrations overview.
Integrations are connected per organization, not per person. Make sure you are working in the right one — the organization switcher is in the app header.
The owner or admin role
Only an owner or an admin can connect and manage credentials for an organization. If you do not see the connect controls, ask an owner or admin to connect the service. See roles & permissions.
An account on the service
For most services you sign in with your existing account during the connect step. Some services need an API key instead — you can paste one in.
You do not have to connect everything yourself. ModuleX offers managed keys for many services — see Three ways to connect below — so you can try a tool before bringing your own account.
Connecting a service stores a credential: an encrypted record that links your organization to that service. You create it once; ModuleX encrypts it, and uses it automatically every time a workflow or the Assistant calls one of that service’s tools. You never paste a secret into a workflow.Behind the scenes there are a few canonical terms worth knowing.
Integration vs. tool
An integration is the connection to one service, for example GitHub. Each integration exposes many tools — the individual actions you can call, such as github.create_issue or github.list_repositories. ModuleX has 175 integrations and 600+ tools in total. Browse them in the catalog.
Credential
A credential is the encrypted, organization-scoped record that proves your identity to a service. One integration can hold more than one credential — for example a production GitHub and a test GitHub — and you mark one as the default.
Default credential
When a tool runs and you have not picked a specific credential, ModuleX uses the one you marked as default for that integration. Set or change the default any time from managing credentials.
A service tells ModuleX which methods it supports. Most integrations offer one or more of these three. The connect screen shows you only the options that apply.
OAuth (recommended)
Sign in to the service and grant access — no copying secrets. This is the smoothest path and is covered step by step below. The technical details live in integration authentication.
Your own key (BYOK)
Paste an API key or token you already have from the service. Usage is billed directly by the provider, with no ModuleX markup.
ModuleX-managed key
For supported services, use a key ModuleX provides — nothing to set up. Managed usage is metered in credits.
OAuth lets you connect by signing in to the service, instead of handling secrets yourself. The example below uses GitHub; the steps are the same for any service that offers OAuth.
1
Open the integrations catalog
In the app, go to your organization settings and open Browse integrations. Find the service — search by name or filter by category — and open it. See the integrations overview for a tour of the catalog.
2
Start the connection
Choose Add credential, then pick OAuth as the method. Give the credential a clear name — for example Production GitHub — so you can tell it apart later if you connect more than one account. Turning on Make default lets workflows use it automatically.
3
Sign in and grant access
ModuleX sends you to the service’s own sign-in and consent screen. Review the access it asks for, then approve. This grant uses OAuth2 with PKCE, an industry-standard secure flow — you stay on the service’s site to sign in, and ModuleX never sees your password.
4
Return to ModuleX
After you approve, the service sends you back to ModuleX and the credential is saved automatically. You will see a success message, and the integration now shows as connected. That is it — the service is ready to use across your workflows and the Assistant.
The integration appears under your connected credentials with a name, the OAuth method, and a default badge if you set one. You are ready to use the tool in a workflow.
If a service does not offer OAuth, or you would rather bring your own account, choose API key (or bearer token) on the same connect screen and paste the value from the service. ModuleX checks the key before saving so you catch a typo early. The secret is encrypted at rest and never shown again in full — only a masked preview.For the full list of methods a service can offer and how each is stored and resolved, see integration authentication.
With the service connected, you can call its actions from a workflow. The unit that does this is the tool node — it runs one action, with parameters you control, and writes the result into your run so later steps can use it.
1
Add a tool node
Open a workflow in the workflow builder and add a tool node to the canvas.
2
Pick the integration and action
In the node’s detail panel, pick the connected integration (for example GitHub) and then the action you want (for example create_issue). ModuleX shows the credential it will use — the default for that integration unless you choose another.
3
Fill in the parameters
Enter the action’s inputs — for create_issue, that is the repository, the title, and the body. You can type fixed values, or pull a value from an earlier step using a {{node_id.field}} reference. See variables & references for the reference syntax.
4
Run and check the result
Run the workflow. The tool node calls the service, and the action’s result is written into run state under the node’s own id, ready for the next step. For how runs stream and how failures surface, see running workflows.
Want a step where the AI decides which tools to call, rather than a fixed action? Use the agent node, or let the Assistant use your connected tools directly in chat — no workflow required.
You can also create a credential through the API. Authenticate every request with your API key as Authorization: Bearer mx_live_… plus the X-Organization-ID header for your organization. The example below creates an API-key credential for a service; the response masks the secret.
OAuth connections involve a browser sign-in step, so they are made in the app, not from a single API call. Use the app’s connect flow for OAuth, and the API for key-based credentials.
Creating and managing credentials requires the owner or admin role. A request from a non-admin member is rejected. ModuleX never reads the organization from the request body — it always comes from the X-Organization-ID header.
For the full credential API — listing, setting a default, testing, and deleting — see managing credentials.
A connection lasts until the service’s access expires or is revoked. For OAuth connections, ModuleX refreshes access automatically in the background as tokens near expiry, so most connections keep working without any action from you.
If an OAuth connection stops working — for example because access was revoked on the service — reconnect it rather than looking for a manual “refresh” button. Connect the service again with OAuth, and set the new credential as the default. A manual one-click OAuth refresh in the app is a known limitation and should not be relied on.
To rotate a key-based credential, connect the service again with the new key, mark it as the default, and delete the old one. See managing credentials.
How a connected service is billed depends on which method you used to connect it.
Your own key (BYOK)
Usage is billed directly by the service provider, with no ModuleX markup. It is not metered in ModuleX credits.
ModuleX-managed key
Tool calls made through a ModuleX-managed key are metered in credits. When your plan’s allowance runs out, calls are subject to the usage gate — see usage gating & limits.
I do not see the connect or Add credential controls
Connecting integrations requires the owner or admin role for the organization. Switch to the correct organization in the header, or ask an owner or admin to connect the service. See roles & permissions.
The OAuth window returned an error
Start the connection again from the catalog. The sign-in step is time-limited, so if you waited too long on the consent screen, the attempt expires and you simply retry. If the service reports that access was denied, approve the requested permissions when prompted.
My API key was rejected
Double-check you copied the full key from the service, with no extra spaces, and that it has the permissions the action needs. ModuleX tests a key before saving, so a rejection here means the service did not accept it.
The tool node does not list my integration
Confirm the credential was saved in the same organization you are building the workflow in, and that the integration shows as connected. If you connected more than one account, check which credential is set as the default.
What integrations are, how the catalog is organized, and how to browse 175 services.
Tool node
The full reference for calling one integration action from a workflow.
Managing credentials
List, set defaults for, test, and delete the credentials your organization has connected.
Integration authentication
The connect methods a service can offer and how each secret is stored and resolved.
Was this page helpful?
{"docsConfig":{"theme":"aspen","$schema":"https://mintlify.com/docs.json","name":"Modulex.dev","colors":{"primary":"#1A1A1A","light":"#E8E8E8"},"logo":{"light":"https://mintcdn.com/modulexaillc/zKB2qsP6Q61VNLfB/logo/modulex-text-logo-light.svg?fit=max\u0026auto=format\u0026n=zKB2qsP6Q61VNLfB\u0026q=85\u0026s=c9b593919cfb7793915cfb4dc114a1ce","dark":"https://mintcdn.com/modulexaillc/zKB2qsP6Q61VNLfB/logo/modulex-text-logo.svg?fit=max\u0026auto=format\u0026n=zKB2qsP6Q61VNLfB\u0026q=85\u0026s=c4d3f7655c6a906629ff726122a81f75"},"favicon":"https://mintcdn.com/modulexaillc/zKB2qsP6Q61VNLfB/favicon.ico?fit=max\u0026auto=format\u0026n=zKB2qsP6Q61VNLfB\u0026q=85\u0026s=401735aec186c6140e0362ca098fcf4b","navbar":{"primary":{"type":"button","label":"Application","href":"https://app.modulex.dev"}},"footer":{"socials":{"x":"https://x.com/modulexdev","github":"https://github.com/ModuleXAI","linkedin":"https://www.linkedin.com/company/modulexdev","discord":"https://discord.gg/jEyCABwU9E","youtube":"https://www.youtube.com/modulexdev"}},"integrations":{"posthog":{"apiKey":"phc_urc4As8RpqT4j3ZmQCZseXnkzVtSnfjpVK9Am4NUoLJm","sessionRecording":false}},"styling":{"latex":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"modulexaillc","hasAudioNarration":false,"actualSubdomain":"modulexaillc","customDomains":["docs.modulex.dev"],"gitSource":{"type":"github","owner":"modulexai","repo":"modulex-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6a6368768eddce96d088a5a8","collectionId":"c2179899-a985-4799-9ee9-0c035aaa7a5e","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6a6368768eddce96d088a5a8"},"feedback":{"thumbs":true},"entitlements":{},"buildId":"6ae943865f7e866f98d13069:success","clientVersion":"0.0.4054","searchFilterCounts":[{"language":"default","tag":"Integrations","count":196},{"language":"default","tag":"Tools","count":175},{"language":"default","tag":"Build","count":44},{"language":"default","tag":"API References","count":37},{"language":"default","tag":"Productivity","count":21},{"language":"default","tag":"Learn","count":19},{"language":"default","tag":"Developer Tools","count":19},{"language":"default","tag":"Start","count":18},{"language":"default","tag":"Enterprise","count":18},{"language":"default","tag":"Marketing","count":17}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"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":"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":"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":"full-page-search","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":"turbopuffer-dual-write","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},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"custom.css","content":"#content-area{font-size:.9375rem}#content-area h1,main h1{font-size:1.75rem;line-height:1.25}#content-area h2,main h2{font-size:1.375rem;line-height:1.3}#content-area h3,main h3{font-size:1.15rem}#content-area h4,main h4{font-size:1rem}#content-area li,#content-area p,#content-area td,main li,main p,main td{font-size:.9375rem;line-height:1.7}a[href=\"https://app.modulex.dev\"] .bg-primary-dark{background-color:#1f1f1f!important}.dark a[href=\"https://app.modulex.dev\"] .bg-primary-dark{background-color:#fff!important}.dark a[href=\"https://app.modulex.dev\"] .text-white{color:#0d0d0f!important}"}],"page":{"pagePath":"guides/connect-an-integration","slug":"/guides/connect-an-integration","pageMetadata":{"title":"Connect an integration","description":"Connect a third-party service to ModuleX with OAuth or your own key, then call its tool from a workflow. A step-by-step guide for connecting GitHub, Slack, and 175 other integrations.","keywords":["connect an integration","OAuth","OAuth2 PKCE","connect a service","credentials","tool node","ModuleX integrations","BYOK","175 integrations"],"canonical":"https://docs.modulex.dev/guides/connect-an-integration","href":"/guides/connect-an-integration"},"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: \"Connect a third-party service to ModuleX with OAuth or your own key, then call its tool from a workflow. A step-by-step guide for connecting GitHub, Slack, and 175 other integrations.\"\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];const MediaEmbed=({id,type=`screenshot`,caption=``,ext,ratio=`16 / 9`})=>{const isVideo=type===`video`||type===`app_video`;const resolvedExt=ext||(isVideo?`mp4`:type===`screenshot`?`webp`:`svg`);const src=`https://media.modulex.dev/`+id+`.`+resolvedExt;const[status,setStatus]=useState(`loading`);const[isDev,setIsDev]=useState(false);const[inView,setInView]=useState(false);const boxRef=useRef(null);useEffect(()=>{if(typeof window===`undefined`)return;const h=window.location.hostname;setIsDev(h===`localhost`||h===`127.0.0.1`||h.endsWith(`.mintlify.app`))},[]);useEffect(()=>{if(inView)return;if(typeof IntersectionObserver===`undefined`){setInView(true);return}const el=boxRef.current;if(!el)return;const io=new IntersectionObserver(entries=>{if(entries.some(e=>e.isIntersecting)){setInView(true);io.disconnect()}},{rootMargin:`300px`});io.observe(el);return()=>io.disconnect()},[inView]);if(status===`missing`){if(!isDev)return null;return _jsxs(`div`,{style:{display:`flex`,flexDirection:`column`,justifyContent:`center`,gap:`0.4rem`,padding:`1rem 1.25rem`,margin:`1.25rem 0`,width:`100%`,aspectRatio:ratio,boxSizing:`border-box`,border:`1px dashed rgba(128,128,128,0.45)`,borderRadius:`0.75rem`,background:`rgba(128,128,128,0.06)`,color:`currentColor`,fontSize:`0.85rem`,lineHeight:1.45},children:[_jsxs(`div`,{style:{display:`flex`,alignItems:`center`,gap:`0.5rem`,opacity:.75},children:[_jsx(`span`,{\"aria-hidden\":`true`,children:`🎬`}),_jsx(`code`,{style:{fontSize:`0.75rem`},children:id}),_jsx(`span`,{style:{fontSize:`0.65rem`,textTransform:`uppercase`,letterSpacing:`0.04em`,padding:`0.1rem 0.4rem`,borderRadius:`0.4rem`,background:`rgba(128,128,128,0.18)`},children:type})]}),_jsx(`div`,{style:{opacity:.9},children:caption||`Media not uploaded yet.`}),_jsxs(`div`,{style:{fontSize:`0.7rem`,opacity:.5},children:[`Upload to R2 as `,_jsxs(`code`,{children:[id,`.`,resolvedExt]}),` — preview only, hidden in production.`]})]})}const mediaStyle={display:status===`loaded`?`block`:`none`,width:`100%`,height:`auto`,borderRadius:`0.75rem`};const media=isVideo?_jsx(`video`,{src:inView?src:undefined,autoPlay:true,loop:true,muted:true,playsInline:true,preload:`metadata`,onLoadedData:()=>setStatus(`loaded`),onError:()=>setStatus(`missing`),style:mediaStyle}):_jsx(`img`,{src:inView?src:undefined,alt:caption,onLoad:()=>setStatus(`loaded`),onError:()=>setStatus(`missing`),style:mediaStyle});return _jsxs(`figure`,{style:{margin:`1.25rem 0`},children:[_jsx(`div`,{ref:boxRef,style:status===`loaded`?{width:`100%`}:{width:`100%`,aspectRatio:ratio,borderRadius:`0.75rem`,background:`rgba(128,128,128,0.06)`},children:media}),status===`loaded`\u0026\u0026caption?_jsx(`figcaption`,{style:{marginTop:`0.5rem`,textAlign:`center`,fontSize:`0.85rem`,opacity:.7},children:caption}):null]})};function _createMdxContent(props){const _components={a:`a`,code:`code`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,..._provideComponents(),...props.components},{Accordion,AccordionGroup,Card,CardGroup,Check,CodeBlock,CodeGroup,Heading,Info,Note,Step,Steps,Tip,Warning,_MdxComponentBoundary}=_components;if(!Accordion)_missingMdxReference(`Accordion`,true);if(!AccordionGroup)_missingMdxReference(`AccordionGroup`,true);if(!Card)_missingMdxReference(`Card`,true);if(!CardGroup)_missingMdxReference(`CardGroup`,true);if(!Check)_missingMdxReference(`Check`,true);if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!CodeGroup)_missingMdxReference(`CodeGroup`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Info)_missingMdxReference(`Info`,true);if(!Note)_missingMdxReference(`Note`,true);if(!Step)_missingMdxReference(`Step`,true);if(!Steps)_missingMdxReference(`Steps`,true);if(!Tip)_missingMdxReference(`Tip`,true);if(!Warning)_missingMdxReference(`Warning`,true);if(!_MdxComponentBoundary)_missingMdxReference(`_MdxComponentBoundary`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`ModuleX connects to 175 services — GitHub, Slack, Gmail, Notion, Salesforce, and many more — so your workflows can act on them: open an issue, send a message, read a row, create a contact. This guide walks you through it end to end: connect a service once, then call one of its actions from a `,_jsx(_components.a,{href:`/workflow-builder/nodes/tool`,children:`tool node`}),` in a workflow.`]}),`\n`,_jsxs(_components.p,{children:[`You connect a service `,_jsx(_components.strong,{children:`once`}),`, for your whole organization. After that, every workflow and the `,_jsx(_components.a,{href:`/assistant/overview`,children:`Assistant`}),` can use it. For the bigger picture of what integrations are, start with the `,_jsx(_components.a,{href:`/integrations/overview`,children:`integrations overview`}),`.`]}),`\n`,_jsx(_MdxComponentBoundary,{name:`MediaEmbed`,children:_jsx(MediaEmbed,{id:`MX-MEDIA-4450`,type:`app_video`,caption:`End-to-end walkthrough: connecting GitHub with OAuth, then calling a GitHub action from a tool node in a workflow.`})}),`\n`,_jsx(Heading,{level:`2`,id:`before-you-start`,children:`Before you start`}),`\n`,_jsx(_components.p,{children:`A few things make this go smoothly.`}),`\n`,_jsxs(CardGroup,{cols:3,children:[_jsx(Card,{title:`An account in an organization`,icon:`building`,children:_jsx(_components.p,{children:`Integrations are connected per organization, not per person. Make sure you are working in the right one — the organization switcher is in the app header.`})}),_jsx(Card,{title:`The owner or admin role`,icon:`shield-check`,children:_jsxs(_components.p,{children:[`Only an `,_jsx(_components.strong,{children:`owner`}),` or an `,_jsx(_components.strong,{children:`admin`}),` can connect and manage credentials for an organization. If you do not see the connect controls, ask an owner or admin to connect the service. See `,_jsx(_components.a,{href:`/security/roles-permissions`,children:`roles \u0026 permissions`}),`.`]})}),_jsx(Card,{title:`An account on the service`,icon:`key`,children:_jsx(_components.p,{children:`For most services you sign in with your existing account during the connect step. Some services need an API key instead — you can paste one in.`})})]}),`\n`,_jsx(Info,{children:_jsxs(_components.p,{children:[`You do not have to connect everything yourself. ModuleX offers managed keys for many services — see `,_jsx(_components.a,{href:`#three-ways-to-connect`,children:`Three ways to connect`}),` below — so you can try a tool before bringing your own account.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`how-connecting-works`,children:`How connecting works`}),`\n`,_jsxs(_components.p,{children:[`Connecting a service stores a `,_jsx(_components.strong,{children:`credential`}),`: an encrypted record that links your organization to that service. You create it once; ModuleX encrypts it, and uses it automatically every time a workflow or the Assistant calls one of that service’s tools. You never paste a secret into a workflow.`]}),`\n`,_jsx(_components.p,{children:`Behind the scenes there are a few canonical terms worth knowing.`}),`\n`,_jsxs(AccordionGroup,{children:[_jsx(Accordion,{title:`Integration vs. tool`,id:`integration-vs-tool`,children:_jsxs(_components.p,{children:[`An `,_jsx(_components.strong,{children:`integration`}),` is the connection to one service, for example GitHub. Each integration exposes many `,_jsx(_components.strong,{children:`tools`}),` — the individual actions you can call, such as `,_jsx(_components.code,{children:`github.create_issue`}),` or `,_jsx(_components.code,{children:`github.list_repositories`}),`. ModuleX has 175 integrations and 600+ tools in total. Browse them in the `,_jsx(_components.a,{href:`/integrations/catalog`,children:`catalog`}),`.`]})}),_jsx(Accordion,{title:`Credential`,id:`credential`,children:_jsxs(_components.p,{children:[`A `,_jsx(_components.strong,{children:`credential`}),` is the encrypted, organization-scoped record that proves your identity to a service. One integration can hold more than one credential — for example a production GitHub and a test GitHub — and you mark one as the `,_jsx(_components.strong,{children:`default`}),`.`]})}),_jsx(Accordion,{title:`Default credential`,id:`default-credential`,children:_jsxs(_components.p,{children:[`When a tool runs and you have not picked a specific credential, ModuleX uses the one you marked as `,_jsx(_components.strong,{children:`default`}),` for that integration. Set or change the default any time from `,_jsx(_components.a,{href:`/integrations/managing-credentials`,children:`managing credentials`}),`.`]})})]}),`\n`,_jsx(Heading,{level:`2`,id:`three-ways-to-connect`,children:`Three ways to connect`}),`\n`,_jsx(_components.p,{children:`A service tells ModuleX which methods it supports. Most integrations offer one or more of these three. The connect screen shows you only the options that apply.`}),`\n`,_jsxs(CardGroup,{cols:3,children:[_jsx(Card,{title:`OAuth (recommended)`,icon:`lock-keyhole`,children:_jsxs(_components.p,{children:[`Sign in to the service and grant access — no copying secrets. This is the smoothest path and is covered step by step below. The technical details live in `,_jsx(_components.a,{href:`/integrations/authentication`,children:`integration authentication`}),`.`]})}),_jsx(Card,{title:`Your own key (BYOK)`,icon:`key`,children:_jsx(_components.p,{children:`Paste an API key or token you already have from the service. Usage is billed directly by the provider, with no ModuleX markup.`})}),_jsx(Card,{title:`ModuleX-managed key`,icon:`sparkles`,children:_jsxs(_components.p,{children:[`For supported services, use a key ModuleX provides — nothing to set up. Managed usage is metered in `,_jsx(_components.a,{href:`/billing/credits`,children:`credits`}),`.`]})})]}),`\n`,_jsx(Heading,{level:`2`,id:`connect-a-service-with-oauth`,children:`Connect a service with OAuth`}),`\n`,_jsx(_components.p,{children:`OAuth lets you connect by signing in to the service, instead of handling secrets yourself. The example below uses GitHub; the steps are the same for any service that offers OAuth.`}),`\n`,_jsxs(Steps,{children:[_jsxs(Step,{title:`Open the integrations catalog`,children:[_jsxs(_components.p,{children:[`In the app, go to your organization settings and open `,_jsx(_components.strong,{children:`Browse integrations`}),`. Find the service — search by name or filter by category — and open it. See the `,_jsx(_components.a,{href:`/integrations/overview`,children:`integrations overview`}),` for a tour of the catalog.`]}),_jsx(_MdxComponentBoundary,{name:`MediaEmbed`,children:_jsx(MediaEmbed,{id:`MX-MEDIA-4451`,type:`screenshot`,caption:`The Browse integrations catalog with GitHub highlighted.`})})]}),_jsx(Step,{title:`Start the connection`,children:_jsxs(_components.p,{children:[`Choose `,_jsx(_components.strong,{children:`Add credential`}),`, then pick `,_jsx(_components.strong,{children:`OAuth`}),` as the method. Give the credential a clear name — for example `,_jsx(_components.code,{children:`Production GitHub`}),` — so you can tell it apart later if you connect more than one account. Turning on `,_jsx(_components.strong,{children:`Make default`}),` lets workflows use it automatically.`]})}),_jsxs(Step,{title:`Sign in and grant access`,children:[_jsx(_components.p,{children:`ModuleX sends you to the service’s own sign-in and consent screen. Review the access it asks for, then approve. This grant uses OAuth2 with PKCE, an industry-standard secure flow — you stay on the service’s site to sign in, and ModuleX never sees your password.`}),_jsx(_MdxComponentBoundary,{name:`MediaEmbed`,children:_jsx(MediaEmbed,{id:`MX-MEDIA-4452`,type:`screenshot`,caption:`A third-party OAuth consent screen (for example GitHub) shown during the connect flow.`})})]}),_jsx(Step,{title:`Return to ModuleX`,children:_jsx(_components.p,{children:`After you approve, the service sends you back to ModuleX and the credential is saved automatically. You will see a success message, and the integration now shows as connected. That is it — the service is ready to use across your workflows and the Assistant.`})})]}),`\n`,_jsx(Check,{children:_jsxs(_components.p,{children:[`The integration appears under your connected credentials with a name, the OAuth method, and a default badge if you set one. You are ready to `,_jsx(_components.a,{href:`#use-the-tool-in-a-workflow`,children:`use the tool in a workflow`}),`.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`connect-with-your-own-key-instead`,children:`Connect with your own key instead`}),`\n`,_jsxs(_components.p,{children:[`If a service does not offer OAuth, or you would rather bring your own account, choose `,_jsx(_components.strong,{children:`API key`}),` (or `,_jsx(_components.strong,{children:`bearer token`}),`) on the same connect screen and paste the value from the service. ModuleX checks the key before saving so you catch a typo early. The secret is encrypted at rest and never shown again in full — only a masked preview.`]}),`\n`,_jsxs(_components.p,{children:[`For the full list of methods a service can offer and how each is stored and resolved, see `,_jsx(_components.a,{href:`/integrations/authentication`,children:`integration authentication`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`use-the-tool-in-a-workflow`,children:`Use the tool in a workflow`}),`\n`,_jsxs(_components.p,{children:[`With the service connected, you can call its actions from a workflow. The unit that does this is the `,_jsx(_components.a,{href:`/workflow-builder/nodes/tool`,children:`tool node`}),` — it runs one action, with parameters you control, and writes the result into your run so later steps can use it.`]}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Add a tool node`,children:_jsxs(_components.p,{children:[`Open a workflow in the `,_jsx(_components.a,{href:`/workflow-builder/overview`,children:`workflow builder`}),` and add a `,_jsx(_components.strong,{children:`tool node`}),` to the canvas.`]})}),_jsx(Step,{title:`Pick the integration and action`,children:_jsxs(_components.p,{children:[`In the node’s detail panel, pick the connected integration (for example GitHub) and then the action you want (for example `,_jsx(_components.code,{children:`create_issue`}),`). ModuleX shows the credential it will use — the default for that integration unless you choose another.`]})}),_jsx(Step,{title:`Fill in the parameters`,children:_jsxs(_components.p,{children:[`Enter the action’s inputs — for `,_jsx(_components.code,{children:`create_issue`}),`, that is the repository, the title, and the body. You can type fixed values, or pull a value from an earlier step using a `,_jsx(_components.code,{children:`{{node_id.field}}`}),` reference. See `,_jsx(_components.a,{href:`/workflow-builder/variables-and-references`,children:`variables \u0026 references`}),` for the reference syntax.`]})}),_jsx(Step,{title:`Run and check the result`,children:_jsxs(_components.p,{children:[`Run the workflow. The tool node calls the service, and the action’s result is written into run state under the node’s own id, ready for the next step. For how runs stream and how failures surface, see `,_jsx(_components.a,{href:`/workflow-builder/execution/running`,children:`running workflows`}),`.`]})})]}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`Want a step where the AI decides which tools to call, rather than a fixed action? Use the `,_jsx(_components.a,{href:`/workflow-builder/nodes/agent`,children:`agent node`}),`, or let the `,_jsx(_components.a,{href:`/assistant/overview`,children:`Assistant`}),` use your connected tools directly in chat — no workflow required.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`connect-a-service-from-code`,children:`Connect a service from code`}),`\n`,_jsxs(_components.p,{children:[`You can also create a credential through the API. Authenticate every request with your API key as `,_jsx(_components.code,{children:`Authorization: Bearer mx_live_…`}),` plus the `,_jsx(_components.code,{children:`X-Organization-ID`}),` header for your organization. The example below creates an API-key credential for a service; the response masks the secret.`]}),`\n`,_jsx(Note,{children:_jsx(_components.p,{children:`OAuth connections involve a browser sign-in step, so they are made in the app, not from a single API call. Use the app’s connect flow for OAuth, and the API for key-based credentials.`})}),`\n`,_jsxs(CodeGroup,{children:[_jsx(CodeBlock,{filename:`cURL`,numberOfLines:`10`,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:`10`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -X`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` POST`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` https://api.modulex.dev/credentials`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Authorization: Bearer mx_live_yourkey\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"X-Organization-ID: 8f2b1c4e-1a2b-4c3d-9e8f-7a6b5c4d3e2f\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Content-Type: application/json\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -d`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` '{`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"integration_name\": \"tavily\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"display_name\": \"Production Tavily\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"make_default\": true,`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"auth_data\": { \"api_key\": \"tvly-your-service-key\" }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` }'`})}),`\n`]})})}),_jsx(CodeBlock,{filename:`Python`,numberOfLines:`17`,language:`python`,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:`python`,children:_jsxs(_components.code,{language:`python`,numberOfLines:`17`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` httpx`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`resp `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` httpx.post(`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"https://api.modulex.dev/credentials\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` headers`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Authorization\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Bearer mx_live_yourkey\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"X-Organization-ID\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"8f2b1c4e-1a2b-4c3d-9e8f-7a6b5c4d3e2f\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` json`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"integration_name\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"tavily\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"display_name\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Production Tavily\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"make_default\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`True`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"auth_data\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"api_key\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"tvly-your-service-key\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`},`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`resp.raise_for_status()`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`print`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(resp.json())`})]}),`\n`]})})}),_jsx(CodeBlock,{filename:`JavaScript`,numberOfLines:`16`,language:`javascript`,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:`javascript`,children:_jsxs(_components.code,{language:`javascript`,numberOfLines:`16`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` resp`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` await`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` fetch`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"https://api.modulex.dev/credentials\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` method:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"POST\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` headers:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` Authorization:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Bearer mx_live_yourkey\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"X-Organization-ID\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"8f2b1c4e-1a2b-4c3d-9e8f-7a6b5c4d3e2f\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Content-Type\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"application/json\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` body:`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` JSON`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`stringify`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`({`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` integration_name:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"tavily\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` display_name:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Production Tavily\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` make_default:`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` true`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` auth_data:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`api_key:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"tvly-your-service-key\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }),`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`});`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`if`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` (`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`!`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`resp`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`ok`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`throw`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` new`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` Error`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:\"`HTTP \"}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#569CD6`},children:\"${\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`resp`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`status`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#569CD6`},children:`}`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:\"`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`console`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`log`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`await`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` resp`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`json`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`());`})]}),`\n`]})})})]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`Creating and managing credentials requires the `,_jsx(_components.strong,{children:`owner`}),` or `,_jsx(_components.strong,{children:`admin`}),` role. A request from a non-admin member is rejected. ModuleX never reads the organization from the request body — it always comes from the `,_jsx(_components.code,{children:`X-Organization-ID`}),` header.`]})}),`\n`,_jsxs(_components.p,{children:[`For the full credential API — listing, setting a default, testing, and deleting — see `,_jsx(_components.a,{href:`/integrations/managing-credentials`,children:`managing credentials`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`keep-a-connection-working`,children:`Keep a connection working`}),`\n`,_jsx(_components.p,{children:`A connection lasts until the service’s access expires or is revoked. For OAuth connections, ModuleX refreshes access automatically in the background as tokens near expiry, so most connections keep working without any action from you.`}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`If an OAuth connection stops working — for example because access was revoked on the service — `,_jsx(_components.strong,{children:`reconnect it`}),` rather than looking for a manual “refresh” button. Connect the service again with OAuth, and set the new credential as the default. A manual one-click OAuth refresh in the app is a `,_jsx(_components.a,{href:`/reference/known-limitations`,children:`known limitation`}),` and should not be relied on.`]})}),`\n`,_jsxs(_components.p,{children:[`To rotate a key-based credential, connect the service again with the new key, mark it as the default, and delete the old one. See `,_jsx(_components.a,{href:`/integrations/managing-credentials`,children:`managing credentials`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`what-it-costs`,children:`What it costs`}),`\n`,_jsx(_components.p,{children:`How a connected service is billed depends on which method you used to connect it.`}),`\n`,_jsxs(CardGroup,{cols:2,children:[_jsx(Card,{title:`Your own key (BYOK)`,icon:`key`,children:_jsx(_components.p,{children:`Usage is billed directly by the service provider, with no ModuleX markup. It is not metered in ModuleX credits.`})}),_jsx(Card,{title:`ModuleX-managed key`,icon:`sparkles`,children:_jsxs(_components.p,{children:[`Tool calls made through a ModuleX-managed key are metered in `,_jsx(_components.a,{href:`/billing/credits`,children:`credits`}),`. When your plan’s allowance runs out, calls are subject to the usage gate — see `,_jsx(_components.a,{href:`/billing/usage-gating`,children:`usage gating \u0026 limits`}),`.`]})})]}),`\n`,_jsx(Heading,{level:`2`,id:`troubleshooting`,children:`Troubleshooting`}),`\n`,_jsxs(AccordionGroup,{children:[_jsx(Accordion,{title:`I do not see the connect or Add credential controls`,id:`i-do-not-see-the-connect-or-add-credential-controls`,children:_jsxs(_components.p,{children:[`Connecting integrations requires the `,_jsx(_components.strong,{children:`owner`}),` or `,_jsx(_components.strong,{children:`admin`}),` role for the organization. Switch to the correct organization in the header, or ask an owner or admin to connect the service. See `,_jsx(_components.a,{href:`/security/roles-permissions`,children:`roles \u0026 permissions`}),`.`]})}),_jsx(Accordion,{title:`The OAuth window returned an error`,id:`the-oauth-window-returned-an-error`,children:_jsx(_components.p,{children:`Start the connection again from the catalog. The sign-in step is time-limited, so if you waited too long on the consent screen, the attempt expires and you simply retry. If the service reports that access was denied, approve the requested permissions when prompted.`})}),_jsx(Accordion,{title:`My API key was rejected`,id:`my-api-key-was-rejected`,children:_jsx(_components.p,{children:`Double-check you copied the full key from the service, with no extra spaces, and that it has the permissions the action needs. ModuleX tests a key before saving, so a rejection here means the service did not accept it.`})}),_jsx(Accordion,{title:`The tool node does not list my integration`,id:`the-tool-node-does-not-list-my-integration`,children:_jsxs(_components.p,{children:[`Confirm the credential was saved in the `,_jsx(_components.strong,{children:`same organization`}),` you are building the workflow in, and that the integration shows as connected. If you connected more than one account, check which credential is set as the default.`]})}),_jsx(Accordion,{title:`My run was blocked with a limit or credit error`,id:`my-run-was-blocked-with-a-limit-or-credit-error`,children:_jsxs(_components.p,{children:[`Tools that use a ModuleX-managed key consume `,_jsx(_components.a,{href:`/billing/credits`,children:`credits`}),`. If your plan’s allowance is exhausted, the run is stopped by the usage gate. See `,_jsx(_components.a,{href:`/billing/usage-gating`,children:`usage gating \u0026 limits`}),` and `,_jsx(_components.a,{href:`/help/errors-troubleshooting`,children:`errors \u0026 troubleshooting`}),`.`]})})]}),`\n`,_jsx(Heading,{level:`2`,id:`next-steps`,children:`Next steps`}),`\n`,_jsxs(CardGroup,{cols:2,children:[_jsx(Card,{title:`Integrations overview`,icon:`plug`,href:`/integrations/overview`,children:_jsx(_components.p,{children:`What integrations are, how the catalog is organized, and how to browse 175 services.`})}),_jsx(Card,{title:`Tool node`,icon:`wrench`,href:`/workflow-builder/nodes/tool`,children:_jsx(_components.p,{children:`The full reference for calling one integration action from a workflow.`})}),_jsx(Card,{title:`Managing credentials`,icon:`id-card`,href:`/integrations/managing-credentials`,children:_jsx(_components.p,{children:`List, set defaults for, test, and delete the credentials your organization has connected.`})}),_jsx(Card,{title:`Integration authentication`,icon:`lock-keyhole`,href:`/integrations/authentication`,children:_jsx(_components.p,{children:`The connect methods a service can offer and how each secret is stored and resolved.`})})]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{MediaEmbed,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":"Connect an integration","description":"Connect a third-party service to ModuleX with OAuth or your own key, then call its tool from a workflow. A step-by-step guide for connecting GitHub, Slack, and 175 other integrations.","keywords":["connect an integration","OAuth","OAuth2 PKCE","connect a service","credentials","tool node","ModuleX integrations","BYOK","175 integrations"],"canonical":"https://docs.modulex.dev/guides/connect-an-integration","href":"/guides/connect-an-integration"}}},"mdxSourceWithNoJs":null,"noJsSplices":[[146,2921,")=>null;function _cr"]]},"mdxExtracts":{"tableOfContents":[{"title":"Before you start","slug":"before-you-start","depth":2,"children":[]},{"title":"How connecting works","slug":"how-connecting-works","depth":2,"children":[]},{"title":"Three ways to connect","slug":"three-ways-to-connect","depth":2,"children":[]},{"title":"Connect a service with OAuth","slug":"connect-a-service-with-oauth","depth":2,"children":[{"title":"Connect with your own key instead","slug":"connect-with-your-own-key-instead","depth":3,"children":[]}]},{"title":"Use the tool in a workflow","slug":"use-the-tool-in-a-workflow","depth":2,"children":[]},{"title":"Connect a service from code","slug":"connect-a-service-from-code","depth":2,"children":[]},{"title":"Keep a connection working","slug":"keep-a-connection-working","depth":2,"children":[]},{"title":"What it costs","slug":"what-it-costs","depth":2,"children":[]},{"title":"Troubleshooting","slug":"troubleshooting","depth":2,"children":[]},{"title":"Next steps","slug":"next-steps","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"modulexaillc","siteName":"Modulex.dev","title":"Connect an integration - Modulex.dev","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-06-24T22:30:04.188Z","originalFileLocation":"guides/connect-an-integration.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=\"Connect a third-party service to ModuleX with OAuth or your own key, then call its tool from a workflow. A step-by-step guide for connecting GitHub, Slack, and 175 other integrations.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Modulex.dev\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/modulexaillc/vkVIobovuNK-ENx6/_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/modulexaillc/vkVIobovuNK-ENx6/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/modulexaillc/vkVIobovuNK-ENx6/_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/modulexaillc/vkVIobovuNK-ENx6/_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/modulexaillc/vkVIobovuNK-ENx6/_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/modulexaillc/vkVIobovuNK-ENx6/_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/modulexaillc/vkVIobovuNK-ENx6/_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/modulexaillc/vkVIobovuNK-ENx6/_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/modulexaillc/vkVIobovuNK-ENx6/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Connect an integration - Modulex.dev\">\u003cmeta data-mint-head property=\"og:description\" content=\"Connect a third-party service to ModuleX with OAuth or your own key, then call its tool from a workflow. A step-by-step guide for connecting GitHub, Slack, and 175 other integrations.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Modulex.dev\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.modulex.dev/guides/connect-an-integration\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://modulexaillc.mintlify.app/_mintlify/api/og/v2?division=Guides\u0026amp;title=Connect+an+integration\u0026amp;description=Connect+a+third-party+service+to+ModuleX+with+OAuth+or+your+own+key%2C+then+call+its+tool+from+a+workflow.+A+step-by-step+guide+for+connecting+GitHub%2C+Slack%2C+and+\u0026amp;theme=ac24d983feea2da2b1ba56e6\u0026amp;signature=189300dc5f97d274e77b80420b5cc3716641fa65abbc5b35f9c5c98c4b1da408\">\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=\"Connect an integration - Modulex.dev\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Connect a third-party service to ModuleX with OAuth or your own key, then call its tool from a workflow. A step-by-step guide for connecting GitHub, Slack, and 175 other integrations.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://modulexaillc.mintlify.app/_mintlify/api/og/v2?division=Guides\u0026amp;title=Connect+an+integration\u0026amp;description=Connect+a+third-party+service+to+ModuleX+with+OAuth+or+your+own+key%2C+then+call+its+tool+from+a+workflow.+A+step-by-step+guide+for+connecting+GitHub%2C+Slack%2C+and+\u0026amp;theme=ac24d983feea2da2b1ba56e6\u0026amp;signature=189300dc5f97d274e77b80420b5cc3716641fa65abbc5b35f9c5c98c4b1da408\">\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/modulexaillc/vkVIobovuNK-ENx6/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Modulex.dev\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#1A1A1A\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.modulex.dev/guides/connect-an-integration\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/guides/connect-an-integration.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.modulex.dev/#organization\",\"name\":\"Modulex.dev\",\"url\":\"https://docs.modulex.dev\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/modulexaillc/zKB2qsP6Q61VNLfB/logo/modulex-text-logo-light.svg?fit=max\u0026auto=format\u0026n=zKB2qsP6Q61VNLfB\u0026q=85\u0026s=c9b593919cfb7793915cfb4dc114a1ce\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.modulex.dev#website\",\"name\":\"Modulex.dev\",\"url\":\"https://docs.modulex.dev\",\"publisher\":{\"@id\":\"https://docs.modulex.dev/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.modulex.dev/guides/connect-an-integration#webpage\",\"url\":\"https://docs.modulex.dev/guides/connect-an-integration\",\"name\":\"Connect an integration\",\"description\":\"Connect a third-party service to ModuleX with OAuth or your own key, then call its tool from a workflow. A step-by-step guide for connecting GitHub, Slack, and 175 other integrations.\",\"dateModified\":\"2026-06-24T22:30:04.188Z\",\"isPartOf\":{\"@id\":\"https://docs.modulex.dev#website\"},\"breadcrumb\":{\"@id\":\"https://docs.modulex.dev/guides/connect-an-integration#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.modulex.dev/guides/connect-an-integration#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Guides\",\"item\":\"https://docs.modulex.dev/guides/build-with-composer\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Connect an integration\",\"item\":\"https://docs.modulex.dev/guides/connect-an-integration\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.modulex.dev/guides/connect-an-integration#article\",\"headline\":\"Connect an integration\",\"name\":\"Connect an integration\",\"description\":\"Connect a third-party service to ModuleX with OAuth or your own key, then call its tool from a workflow. A step-by-step guide for connecting GitHub, Slack, and 175 other integrations.\",\"url\":\"https://docs.modulex.dev/guides/connect-an-integration\",\"mainEntityOfPage\":{\"@id\":\"https://docs.modulex.dev/guides/connect-an-integration#webpage\"},\"dateModified\":\"2026-06-24T22:30:04.188Z\",\"keywords\":\"connect an integration, OAuth, OAuth2 PKCE, connect a service, credentials, tool node, ModuleX integrations, BYOK, 175 integrations\",\"publisher\":{\"@id\":\"https://docs.modulex.dev/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.modulex.dev#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Modulex.dev\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Modulex.dev","nav":{"global":null,"tabs":[{"tab":"Start","pages":[{"title":"Start","href":""}]},{"tab":"Build","pages":[{"title":"Build","href":"/platform/overview"}]},{"tab":"Integrations","pages":[{"title":"Integrations","href":"/integrations/overview"}]},{"tab":"Learn","groups":[{"group":"Billing \u0026 credits","pages":[{"title":"Billing \u0026 credits overview","sidebarTitle":"Overview","href":"/billing/overview"},{"title":"Plans \u0026 pricing","href":"/billing/plans"},{"title":"Credits \u0026 metering","href":"/billing/credits"},{"title":"Usage gating \u0026 limits","href":"/billing/usage-gating"},{"title":"Wallet \u0026 top-ups","href":"/billing/wallet"},{"title":"Subscriptions \u0026 Stripe","href":"/billing/subscription-lifecycle"},{"title":"Trials, grace periods \u0026 account suspension","sidebarTitle":"Trials \u0026 dunning","href":"/billing/trials-dunning"}]},{"group":"Data \u0026 limits","pages":[{"title":"Data model reference","href":"/reference/data-model"},{"title":"Behaviors \u0026 edge cases","sidebarTitle":"Edge cases","href":"/reference/known-limitations"}]},{"group":"Guides","pages":[{"title":"Build a workflow with AI Composer","sidebarTitle":"Build with Composer","href":"/guides/build-with-composer"},{"title":"Realtime collaboration walkthrough","sidebarTitle":"Realtime collab","href":"/guides/realtime-collaboration"},{"title":"Run a workflow (REST + SDK)","sidebarTitle":"Run a workflow","description":"Authenticate, trigger a workflow run, and stream its result over SSE with cURL, the Python SDK, and the JavaScript SDK — including the live billing-gate responses.","href":"/guides/run-a-workflow"},{"title":"Connect an integration","href":"/guides/connect-an-integration"},{"title":"Build a RAG knowledge base","sidebarTitle":"RAG knowledge base","description":"Create a knowledge base (managed modulexdb or BYOK), ingest documents through the parse-chunk-embed pipeline, and query it with vector, hybrid, or RAG-context search over the REST API and the JavaScript and Python SDKs.","href":"/guides/build-a-knowledge-base"},{"title":"Schedule a workflow","href":"/guides/schedule-a-workflow"}]},{"group":"Power using","pages":[{"title":"Power using ModuleX","href":"/power-using/overview"},{"title":"Feature map","sidebarTitle":"Feature map","href":"/power-using/feature-map"},{"title":"Recipes","href":"/power-using/recipes"},{"title":"Optimization","href":"/power-using/optimization"}]}]},{"tab":"API References","pages":[{"title":"API References","href":"/api-reference/overview"}]},{"tab":"Enterprise","pages":[{"title":"Enterprise","href":"/security/overview"}]},{"tab":"Resources","pages":[{"title":"Resources","href":"/reference/glossary"}]},{"tab":"Help","pages":[{"title":"Help","href":"/help/getting-started"}]}]},"basePath":"","title":"Connect an integration - Modulex.dev","buildId":"dpl_345ReqzYaAjzS9QpeJemsKdb7KDj","deploymentId":"dpl_345ReqzYaAjzS9QpeJemsKdb7KDj","dynamics":[],"chunks":[]}