Two shapes, told apart by app. WITHOUT it, this stores a secret: value is write-only, it goes in here and no route gives it back; give at least one host unless the key already has some — a credential no host points at is never injected by the gateway, so it would sit there doing nothing; a key already taken at the same scope is a conflict, as is a host already mapped to another connection. WITH app — a catalog slug or a tool server’s URL — this connects an app and places it: omit auth and the answer carries connectUrl, a hosted sign-in to open in a browser, with the connection pending until consent finishes and active after (poll GET /api/v1/connections/{id}); send auth.mode: "key" with the key in value and it is stored at Composio and checked with one real call, verified reporting the verdict; a tool server that takes a key names the header it goes in with auth.header (absent is Authorization, sent as Bearer <key>; any other header carries the key on its own); a tool server that takes no credential is auth.mode: "none", and gets a row and a placement with nothing stored anywhere. A placement no ework could read — instance on a Worker with no active ework for that Client, client for a Client no Worker has one for — is a conflict naming the pair, refused before a key or a sign-in reaches Composio. The check is made once, up front: an ework removed while Composio is being called can still leave the placement in place, and adding or moving a placement later is checked again at the write. connectUrl is shown once — a replay under the same Idempotency-Key withholds it — and the pasted key is never in any response. sessions says which eworks can use the app now.
An organization-scoped API key, minted in control under Settings → API keys. Every failure to authenticate answers one identical 401: "Provide a valid organization-scoped API key or an active session." Each operation names the one scope it is filed under, <resource>:<read|write>, where the resource is the first path segment after /api/v1/; a key minted today carries all 22 of them. Scopes are RECORDED — on the key and on every audit row — and are not yet enforced: no request is refused for want of one.
CONNECT AN APP. A catalog slug (hubspot, exa) or a tool server's https:// URL. Present, the body is the app shape — placement and name are required, auth and discoveryUrl may follow, and nothing from the secret shape below may appear beside them. Absent, the body is the secret shape and key, kind and value are required.
How the gateway injects it. Required without app. oauth is not accepted here — an OAuth account is made by the connect flow, which is the only path that can revoke it later.
The hosts the gateway injects this credential on. At least one is required unless the key already has hosts: a credential no host points at is never injected.
A bare hostname — no scheme, path, port or wildcard.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Ergoly","description":"How to manage your agency on Ergoly","colors":{"primary":"#079b9b","light":"#3cd3cf","dark":"#0f7170"},"logo":{"light":"https://mintcdn.com/ergoly/-drdYd6uXChmiNIn/logo/light.png?fit=max\u0026auto=format\u0026n=-drdYd6uXChmiNIn\u0026q=85\u0026s=a9084e9caaf8656a821bf02426e31c05","dark":"https://mintcdn.com/ergoly/-drdYd6uXChmiNIn/logo/dark.png?fit=max\u0026auto=format\u0026n=-drdYd6uXChmiNIn\u0026q=85\u0026s=2c7c39ae6542910294a1183134fda8ff","href":"https://www.ergoly.ai"},"favicon":"https://mintcdn.com/ergoly/-drdYd6uXChmiNIn/favicon.png?fit=max\u0026auto=format\u0026n=-drdYd6uXChmiNIn\u0026q=85\u0026s=9e5baceff3d9e2c0f0d473b3a7c5d40b","api":{"playground":{"display":"interactive","proxy":true},"examples":{"defaults":"required","languages":["curl","javascript","python"]}},"background":{"color":{"light":"#f2f3f3","dark":"#282828"}},"navbar":{"links":[{"href":"https://www.ergoly.ai/support","label":"Support"}],"primary":{"type":"button","label":"Sign in","href":"https://control.ergoly.ai/"}},"footer":{"socials":{"website":"https://www.ergoly.ai","linkedin":"https://www.linkedin.com/company/ergoly","github":"https://github.com/ergoly-ai"}},"seo":{"metatags":{"canonical":"https://docs.ergoly.ai"}},"fonts":{"family":"Satoshi","source":"fonts/Satoshi-Variable.woff2","format":"woff2"},"banner":{"content":"Ergoly is hiring. \u003ca href=\"https://www.ergoly.ai/jobs\">Apply today\u003c/a>.","dismissible":true},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"interaction":{"drilldown":false},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"ergoly","hasAudioNarration":false,"actualSubdomain":"ergoly","customDomains":["docs.ergoly.ai"],"gitSource":{"type":"github","owner":"ergoly-ai","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":"","_id":"6af1063edce746e0972c5b68"},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6af1344bc7dcf404baff164b","clientVersion":"0.0.4088","searchFilterCounts":[{"language":"default","tag":"API","count":72},{"language":"default","tag":"Docs","count":49},{"language":"default","tag":"Workers","count":33},{"language":"default","tag":"Connections","count":26},{"language":"default","tag":"Channels","count":14},{"language":"default","tag":"Changelog","count":12},{"language":"default","tag":"Releases","count":12},{"language":"default","tag":"Tasks","count":11},{"language":"default","tag":"Clients","count":9},{"language":"default","tag":"Company","count":9}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","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":"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":"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":"editor-metadata","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":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"comment-mode","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api-reference/connections/create-a-connection","slug":"/api-reference/connections/create-a-connection","pageMetadata":{"title":"Create a connection","description":"Two shapes, told apart by `app`. WITHOUT it, this stores a secret: `value` is write-only, it goes in here and no route gives it back; give at least one host unless the key already has some — a credential no host points at is never injected by the gateway, so it would sit there doing nothing; a key already taken at the same scope is a `conflict`, as is a host already mapped to another connection. WITH `app` — a catalog slug or a tool server's URL — this connects an app and places it: omit `auth` and the answer carries `connectUrl`, a hosted sign-in to open in a browser, with the connection `pending` until consent finishes and `active` after (poll `GET /api/v1/connections/{id}`); send `auth.mode: \"key\"` with the key in `value` and it is stored at Composio and checked with one real call, `verified` reporting the verdict; a tool server that takes a key names the header it goes in with `auth.header` (absent is `Authorization`, sent as `Bearer \u003ckey>`; any other header carries the key on its own); a tool server that takes no credential is `auth.mode: \"none\"`, and gets a row and a placement with nothing stored anywhere. A `placement` no ework could read — `instance` on a Worker with no active ework for that Client, `client` for a Client no Worker has one for — is a `conflict` naming the pair, refused before a key or a sign-in reaches Composio. The check is made once, up front: an ework removed while Composio is being called can still leave the placement in place, and adding or moving a placement later is checked again at the write. `connectUrl` is shown once — a replay under the same `Idempotency-Key` withholds it — and the pasted key is never in any response. `sessions` says which eworks can use the app now.","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/connections","href":"/api-reference/connections/create-a-connection","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_components.p, {\n children: [\"Two shapes, told apart by \", _jsx(_components.code, {\n children: \"app\"\n }), \". WITHOUT it, this stores a secret: \", _jsx(_components.code, {\n children: \"value\"\n }), \" is write-only, it goes in here and no route gives it back; give at least one host unless the key already has some — a credential no host points at is never injected by the gateway, so it would sit there doing nothing; a key already taken at the same scope is a \", _jsx(_components.code, {\n children: \"conflict\"\n }), \", as is a host already mapped to another connection. WITH \", _jsx(_components.code, {\n children: \"app\"\n }), \" — a catalog slug or a tool server’s URL — this connects an app and places it: omit \", _jsx(_components.code, {\n children: \"auth\"\n }), \" and the answer carries \", _jsx(_components.code, {\n children: \"connectUrl\"\n }), \", a hosted sign-in to open in a browser, with the connection \", _jsx(_components.code, {\n children: \"pending\"\n }), \" until consent finishes and \", _jsx(_components.code, {\n children: \"active\"\n }), \" after (poll \", _jsx(_components.code, {\n children: \"GET /api/v1/connections/{id}\"\n }), \"); send \", _jsx(_components.code, {\n children: \"auth.mode: \\\"key\\\"\"\n }), \" with the key in \", _jsx(_components.code, {\n children: \"value\"\n }), \" and it is stored at Composio and checked with one real call, \", _jsx(_components.code, {\n children: \"verified\"\n }), \" reporting the verdict; a tool server that takes a key names the header it goes in with \", _jsx(_components.code, {\n children: \"auth.header\"\n }), \" (absent is \", _jsx(_components.code, {\n children: \"Authorization\"\n }), \", sent as \", _jsx(_components.code, {\n children: \"Bearer \u003ckey>\"\n }), \"; any other header carries the key on its own); a tool server that takes no credential is \", _jsx(_components.code, {\n children: \"auth.mode: \\\"none\\\"\"\n }), \", and gets a row and a placement with nothing stored anywhere. A \", _jsx(_components.code, {\n children: \"placement\"\n }), \" no ework could read — \", _jsx(_components.code, {\n children: \"instance\"\n }), \" on a Worker with no active ework for that Client, \", _jsx(_components.code, {\n children: \"client\"\n }), \" for a Client no Worker has one for — is a \", _jsx(_components.code, {\n children: \"conflict\"\n }), \" naming the pair, refused before a key or a sign-in reaches Composio. The check is made once, up front: an ework removed while Composio is being called can still leave the placement in place, and adding or moving a placement later is checked again at the write. \", _jsx(_components.code, {\n children: \"connectUrl\"\n }), \" is shown once — a replay under the same \", _jsx(_components.code, {\n children: \"Idempotency-Key\"\n }), \" withholds it — and the pasted key is never in any response. \", _jsx(_components.code, {\n children: \"sessions\"\n }), \" says which eworks can use the app now.\"]\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}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Create a connection","description":"Two shapes, told apart by `app`. WITHOUT it, this stores a secret: `value` is write-only, it goes in here and no route gives it back; give at least one host unless the key already has some — a credential no host points at is never injected by the gateway, so it would sit there doing nothing; a key already taken at the same scope is a `conflict`, as is a host already mapped to another connection. WITH `app` — a catalog slug or a tool server's URL — this connects an app and places it: omit `auth` and the answer carries `connectUrl`, a hosted sign-in to open in a browser, with the connection `pending` until consent finishes and `active` after (poll `GET /api/v1/connections/{id}`); send `auth.mode: \"key\"` with the key in `value` and it is stored at Composio and checked with one real call, `verified` reporting the verdict; a tool server that takes a key names the header it goes in with `auth.header` (absent is `Authorization`, sent as `Bearer \u003ckey>`; any other header carries the key on its own); a tool server that takes no credential is `auth.mode: \"none\"`, and gets a row and a placement with nothing stored anywhere. A `placement` no ework could read — `instance` on a Worker with no active ework for that Client, `client` for a Client no Worker has one for — is a `conflict` naming the pair, refused before a key or a sign-in reaches Composio. The check is made once, up front: an ework removed while Composio is being called can still leave the placement in place, and adding or moving a placement later is checked again at the write. `connectUrl` is shown once — a replay under the same `Idempotency-Key` withholds it — and the pasted key is never in any response. `sessions` says which eworks can use the app now.","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/connections","href":"/api-reference/connections/create-a-connection","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"operationId":"createConnection","summary":"Create a connection","description":"Two shapes, told apart by `app`. WITHOUT it, this stores a secret: `value` is write-only, it goes in here and no route gives it back; give at least one host unless the key already has some — a credential no host points at is never injected by the gateway, so it would sit there doing nothing; a key already taken at the same scope is a `conflict`, as is a host already mapped to another connection. WITH `app` — a catalog slug or a tool server's URL — this connects an app and places it: omit `auth` and the answer carries `connectUrl`, a hosted sign-in to open in a browser, with the connection `pending` until consent finishes and `active` after (poll `GET /api/v1/connections/{id}`); send `auth.mode: \"key\"` with the key in `value` and it is stored at Composio and checked with one real call, `verified` reporting the verdict; a tool server that takes a key names the header it goes in with `auth.header` (absent is `Authorization`, sent as `Bearer \u003ckey>`; any other header carries the key on its own); a tool server that takes no credential is `auth.mode: \"none\"`, and gets a row and a placement with nothing stored anywhere. A `placement` no ework could read — `instance` on a Worker with no active ework for that Client, `client` for a Client no Worker has one for — is a `conflict` naming the pair, refused before a key or a sign-in reaches Composio. The check is made once, up front: an ework removed while Composio is being called can still leave the placement in place, and adding or moving a placement later is checked again at the write. `connectUrl` is shown once — a replay under the same `Idempotency-Key` withholds it — and the pasted key is never in any response. `sessions` says which eworks can use the app now.","tags":["connections"],"security":["fa9f6d19-44d1-48dd-b73d-369a996d1cdc"],"parameters":["0d73a7ae-15c0-4a2a-aaa1-60d7573b3ad3"],"requestBody":"51b65ee0-05ff-4cf8-8a36-0f311489f3ab","responses":{"201":"5fc984c8-3ace-4239-9dc6-ebf10e0cc535","400":"9461d4db-5a1a-4f2b-aff8-7601a88aa0a6","401":"d26c0e10-e8d3-4286-9043-5bd172829397","404":"898d90c9-bcf1-4c07-89fa-9c0c4a5e8ba3","409":"f7488675-4947-4838-814b-30b078633654","429":"1c040881-10c5-4c76-873d-b26408b104d6","502":"d5d3837d-1094-4485-9d3c-3b75b90904bb"},"method":"post","type":"path","servers":["15355b2c-94fb-418f-acf2-2e27904062bb"],"path":"/api/v1/connections","baseUrlOptions":["https://control.ergoly.ai"],"title":"Create a connection","codeSamples":[],"requestExampleLanguages":["bash","javascript","python"],"requiredOnlyExamples":true,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"0d73a7ae-15c0-4a2a-aaa1-60d7573b3ad3":{"name":"Idempotency-Key","in":"header","required":false,"description":"Any unique string. A retry under the same key is answered from the first attempt's record, with `X-Idempotent-Replay: true`. The same key with a different body is a conflict.","schema":{"type":"string","description":"Any unique string.","isRequired":false,"uniqueKey":"","typeLabel":"string"}}},"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"app":{"type":"string","description":"CONNECT AN APP. A catalog slug (`hubspot`, `exa`) or a tool server's `https://` URL. Present, the body is the app shape — `placement` and `name` are required, `auth` and `discoveryUrl` may follow, and nothing from the secret shape below may appear beside them. Absent, the body is the secret shape and `key`, `kind` and `value` are required.","uniqueKey":"app","typeLabel":"string"},"placement":{"type":"object","description":"Where the connected app may be used. Required with `app`. More placements can be added afterwards.","properties":{"tier":{"type":"string","enum":["org","worker","client","instance"],"description":"`org` is the whole company; `worker` one Worker; `client` one Client on every Worker serving it; `instance` one Worker for one Client.","isRequired":true,"uniqueKey":"placement.tier","typeLabel":"enum\u003cstring>"},"workerId":{"type":"string","description":"Required for `worker` and `instance`.","uniqueKey":"placement.workerId","typeLabel":"string"},"clientId":{"type":"string","description":"Required for `client` and `instance`.","uniqueKey":"placement.clientId","typeLabel":"string"}},"required":["tier"],"additionalProperties":false,"uniqueKey":"placement","typeLabel":"object"},"name":{"type":"string","description":"What to call the connected app. Required with `app`; unique in the organization.","uniqueKey":"name","typeLabel":"string"},"auth":{"type":"object","description":"How the person authenticates, with `app`. Omitted means a hosted sign-in.","properties":{"mode":{"type":"string","enum":["key","oauth","none"],"description":"`oauth` (the default): a hosted sign-in, answered as `connectUrl`. `key`: a key or token the caller holds, in `value`. `none`: a tool server that takes no credential.","isRequired":true,"uniqueKey":"auth.mode","typeLabel":"enum\u003cstring>"},"value":{"type":"string","description":"The key or token, with `mode: \"key\"`. WRITE-ONLY, like every value on this API.","uniqueKey":"auth.value","typeLabel":"string"},"fields":{"type":"object","additionalProperties":true,"description":"The app's other sign-in fields beside the key (a subdomain), with `mode: \"key\"`. Never the key itself.","uniqueKey":"auth.fields","typeLabel":"object"}},"required":["mode"],"additionalProperties":false,"uniqueKey":"auth","typeLabel":"object"},"discoveryUrl":{"type":"string","description":"With an `app` that is a tool server URL: its authorization server's metadata URL, when you know it. Omitted, Ergoly asks the server.","uniqueKey":"discoveryUrl","typeLabel":"string"},"key":{"type":"string","description":"STORE A SECRET. The slug the agent and the gateway will know it by. Lowercase letters, digits, `_` and `-`. Unique per scope. Required without `app`.","uniqueKey":"key","typeLabel":"string"},"kind":{"type":"string","enum":["api_key","secret","basic"],"description":"How the gateway injects it. Required without `app`. `oauth` is not accepted here — an OAuth account is made by the connect flow, which is the only path that can revoke it later.","uniqueKey":"kind","typeLabel":"enum\u003cstring>"},"value":{"type":"string","description":"The secret itself. Required without `app`. WRITE-ONLY: no response on this API returns it, and there is no route that reads it back.","uniqueKey":"value","typeLabel":"string"},"scope":{"type":"string","enum":["org","worker","client"],"description":"Which identities resolve it. Defaults to `org`.","uniqueKey":"scope","typeLabel":"enum\u003cstring>"},"workerId":{"type":"string","description":"Required when `scope` is `worker`.","uniqueKey":"workerId","typeLabel":"string"},"clientId":{"type":"string","description":"Required when `scope` is `client`.","uniqueKey":"clientId","typeLabel":"string"},"internalOnly":{"type":"boolean","description":"Hide it from client-tier eworks. Cannot be combined with a client scope — it would resolve for no one.","uniqueKey":"internalOnly","typeLabel":"boolean"},"hosts":{"type":"array","items":{"type":"string","description":"A bare hostname — no scheme, path, port or wildcard.","uniqueKey":"hosts.items.[INDEX]","typeLabel":"string"},"description":"The hosts the gateway injects this credential on. At least one is required unless the key already has hosts: a credential no host points at is never injected.","uniqueKey":"hosts","typeLabel":"string[]"}},"required":[],"additionalProperties":false,"uniqueKey":"","typeLabel":"object"},"example":{"key":"stripe_live","kind":"api_key","value":"sk_live_51H8xY2eZvKYlo2C","scope":"org","hosts":["api.stripe.com"]},"examples":{"Example":{"title":"Example","value":{"key":"stripe_live","kind":"api_key","value":"sk_live_51H8xY2eZvKYlo2C","scope":"org","hosts":["api.stripe.com"]}}},"exampleType":"examples"}},"exampleType":"examples"},"responses":{"5fc984c8-3ace-4239-9dc6-ebf10e0cc535":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"oneOf":[{"type":"object","required":["id","key","kind","type","scope","workerId","clientId","internalOnly","managed","hosts","description","provider","account","providerScopes","expiresAt","health","issuer","issuerHost","mcpEndpoint","mcpTransport","mcpTools","mcpStatus","mcpServerName","providerClientId","redirectUri","createdAt","updatedAt"],"properties":{"id":{"type":"string","description":"The connection's id.","isRequired":true,"uniqueKey":"data.oneOf.0.id","typeLabel":"string"},"key":{"type":"string","description":"The slug the agent and the egress gateway know it by.","isRequired":true,"uniqueKey":"data.oneOf.0.key","typeLabel":"string"},"kind":{"type":"string","description":"`api_key`, `secret`, `basic`, `oauth` or `oauth-app`.","isRequired":true,"uniqueKey":"data.oneOf.0.kind","typeLabel":"string"},"type":{"type":"string","enum":["secret","oauth","provider-app","mcp"],"description":"Which family this is. Decides which of the state fields below are set.","isRequired":true,"uniqueKey":"data.oneOf.0.type","typeLabel":"enum\u003cstring>"},"scope":{"type":"string","enum":["org","worker","client"],"description":"Which identities resolve it. Most specific wins: client, then worker, then org.","isRequired":true,"uniqueKey":"data.oneOf.0.scope","typeLabel":"enum\u003cstring>"},"workerId":{"oneOf":[{"type":"string","description":"The Worker it is scoped to, when `scope` is `worker`.","isRequired":true,"uniqueKey":"data.oneOf.0.workerId.oneOf.0","typeLabel":"string"},{"type":"null","description":"The Worker it is scoped to, when `scope` is `worker`.","isRequired":true,"uniqueKey":"data.oneOf.0.workerId.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.oneOf.0.workerId","typeLabel":"string | null"},"clientId":{"oneOf":[{"type":"string","description":"The Client it is scoped to, when `scope` is `client`.","isRequired":true,"uniqueKey":"data.oneOf.0.clientId.oneOf.0","typeLabel":"string"},{"type":"null","description":"The Client it is scoped to, when `scope` is `client`.","isRequired":true,"uniqueKey":"data.oneOf.0.clientId.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.oneOf.0.clientId","typeLabel":"string | null"},"internalOnly":{"type":"boolean","description":"Hidden from client-tier eworks. Never true on a client-scoped connection.","isRequired":true,"uniqueKey":"data.oneOf.0.internalOnly","typeLabel":"boolean"},"managed":{"type":"boolean","description":"System-managed. Readable, never modifiable.","isRequired":true,"uniqueKey":"data.oneOf.0.managed","typeLabel":"boolean"},"hosts":{"type":"array","items":{"type":"string","description":"A hostname.","uniqueKey":"data.oneOf.0.hosts.items.[INDEX]","typeLabel":"string"},"description":"Hostnames the egress gateway injects this credential on. A connection with no host is never injected.","isRequired":true,"uniqueKey":"data.oneOf.0.hosts","typeLabel":"string[]"},"description":{"oneOf":[{"type":"string","description":"What this connection is for, in an operator's own words. Carried to a worker in the per-turn connections index, where it is the only thing that can say a connection named `lemlist` is how LinkedIn outreach gets done. Null when nobody wrote one.","isRequired":true,"uniqueKey":"data.oneOf.0.description.oneOf.0","typeLabel":"string"},{"type":"null","description":"What this connection is for, in an operator's own words. Carried to a worker in the per-turn connections index, where it is the only thing that can say a connection named `lemlist` is how LinkedIn outreach gets done. Null when nobody wrote one.","isRequired":true,"uniqueKey":"data.oneOf.0.description.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.oneOf.0.description","typeLabel":"string | null"},"provider":{"oneOf":[{"type":"string","description":"Provider id, for an OAuth account, provider app or MCP server.","isRequired":true,"uniqueKey":"data.oneOf.0.provider.oneOf.0","typeLabel":"string"},{"type":"null","description":"Provider id, for an OAuth account, provider app or MCP server.","isRequired":true,"uniqueKey":"data.oneOf.0.provider.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.oneOf.0.provider","typeLabel":"string | null"},"account":{"oneOf":[{"type":"string","description":"The connected account's label, as the provider reported it.","isRequired":true,"uniqueKey":"data.oneOf.0.account.oneOf.0","typeLabel":"string"},{"type":"null","description":"The connected account's label, as the provider reported it.","isRequired":true,"uniqueKey":"data.oneOf.0.account.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.oneOf.0.account","typeLabel":"string | null"},"providerScopes":{"type":"array","items":{"type":"string","description":"A scope.","uniqueKey":"data.oneOf.0.providerScopes.items.[INDEX]","typeLabel":"string"},"description":"OAuth scopes the provider granted.","isRequired":true,"uniqueKey":"data.oneOf.0.providerScopes","typeLabel":"string[]"},"expiresAt":{"oneOf":[{"type":"string","format":"date-time","description":"When the access token expires, if the provider said.","isRequired":true,"uniqueKey":"data.oneOf.0.expiresAt.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"When the access token expires, if the provider said.","isRequired":true,"uniqueKey":"data.oneOf.0.expiresAt.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.oneOf.0.expiresAt","typeLabel":"string\u003cdate-time> | null"},"health":{"oneOf":[{"type":"string","description":"`healthy`, `expiring`, `expired` or `unknown`.","isRequired":true,"uniqueKey":"data.oneOf.0.health.oneOf.0","typeLabel":"string"},{"type":"null","description":"`healthy`, `expiring`, `expired` or `unknown`.","isRequired":true,"uniqueKey":"data.oneOf.0.health.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.oneOf.0.health","typeLabel":"string | null"},"issuer":{"oneOf":[{"type":"string","description":"An MCP server's canonical identity.","isRequired":true,"uniqueKey":"data.oneOf.0.issuer.oneOf.0","typeLabel":"string"},{"type":"null","description":"An MCP server's canonical identity.","isRequired":true,"uniqueKey":"data.oneOf.0.issuer.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.oneOf.0.issuer","typeLabel":"string | null"},"issuerHost":{"oneOf":[{"type":"string","description":"That issuer's host — what an operator recognises.","isRequired":true,"uniqueKey":"data.oneOf.0.issuerHost.oneOf.0","typeLabel":"string"},{"type":"null","description":"That issuer's host — what an operator recognises.","isRequired":true,"uniqueKey":"data.oneOf.0.issuerHost.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.oneOf.0.issuerHost","typeLabel":"string | null"},"mcpEndpoint":{"oneOf":[{"type":"string","description":"Where the agent POSTs MCP calls.","isRequired":true,"uniqueKey":"data.oneOf.0.mcpEndpoint.oneOf.0","typeLabel":"string"},{"type":"null","description":"Where the agent POSTs MCP calls.","isRequired":true,"uniqueKey":"data.oneOf.0.mcpEndpoint.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.oneOf.0.mcpEndpoint","typeLabel":"string | null"},"mcpTransport":{"oneOf":[{"type":"string","description":"The observed MCP transport, or `unknown`.","isRequired":true,"uniqueKey":"data.oneOf.0.mcpTransport.oneOf.0","typeLabel":"string"},{"type":"null","description":"The observed MCP transport, or `unknown`.","isRequired":true,"uniqueKey":"data.oneOf.0.mcpTransport.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.oneOf.0.mcpTransport","typeLabel":"string | null"},"mcpTools":{"type":"array","items":{"type":"string","description":"A tool name.","uniqueKey":"data.oneOf.0.mcpTools.items.[INDEX]","typeLabel":"string"},"description":"Tools advertised at the last handshake.","isRequired":true,"uniqueKey":"data.oneOf.0.mcpTools","typeLabel":"string[]"},"mcpStatus":{"oneOf":[{"type":"string","description":"`ok`, `failed`, `pending`, or `needs_reconnect` — the last meaning no endpoint was ever recorded, so it cannot work until it is connected again.","isRequired":true,"uniqueKey":"data.oneOf.0.mcpStatus.oneOf.0","typeLabel":"string"},{"type":"null","description":"`ok`, `failed`, `pending`, or `needs_reconnect` — the last meaning no endpoint was ever recorded, so it cannot work until it is connected again.","isRequired":true,"uniqueKey":"data.oneOf.0.mcpStatus.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.oneOf.0.mcpStatus","typeLabel":"string | null"},"mcpServerName":{"oneOf":[{"type":"string","description":"The server's own product name, when it supplied one.","isRequired":true,"uniqueKey":"data.oneOf.0.mcpServerName.oneOf.0","typeLabel":"string"},{"type":"null","description":"The server's own product name, when it supplied one.","isRequired":true,"uniqueKey":"data.oneOf.0.mcpServerName.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.oneOf.0.mcpServerName","typeLabel":"string | null"},"providerClientId":{"oneOf":[{"type":"string","description":"A provider app's PUBLIC OAuth client id. Its client secret has no field here.","isRequired":true,"uniqueKey":"data.oneOf.0.providerClientId.oneOf.0","typeLabel":"string"},{"type":"null","description":"A provider app's PUBLIC OAuth client id. Its client secret has no field here.","isRequired":true,"uniqueKey":"data.oneOf.0.providerClientId.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.oneOf.0.providerClientId","typeLabel":"string | null"},"redirectUri":{"oneOf":[{"type":"string","description":"The redirect URI Ergoly derives for this provider.","isRequired":true,"uniqueKey":"data.oneOf.0.redirectUri.oneOf.0","typeLabel":"string"},{"type":"null","description":"The redirect URI Ergoly derives for this provider.","isRequired":true,"uniqueKey":"data.oneOf.0.redirectUri.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.oneOf.0.redirectUri","typeLabel":"string | null"},"createdAt":{"type":"string","format":"date-time","description":"When it was created.","isRequired":true,"uniqueKey":"data.oneOf.0.createdAt","typeLabel":"string\u003cdate-time>"},"updatedAt":{"type":"string","format":"date-time","description":"When it last changed.","isRequired":true,"uniqueKey":"data.oneOf.0.updatedAt","typeLabel":"string\u003cdate-time>"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"data.oneOf.0","typeLabel":"object"},{"type":"object","required":["id","app","kind","baseUrl","name","description","status","managed","placements","details","createdAt","lastUsedAt","sessions"],"properties":{"id":{"type":"string","description":"The connection's id.","isRequired":true,"uniqueKey":"data.oneOf.1.id","typeLabel":"string"},"app":{"oneOf":[{"type":"string","description":"The app's slug (`hubspot`); for a tool server, the slug it was registered under.","isRequired":true,"uniqueKey":"data.oneOf.1.app.oneOf.0","typeLabel":"string"},{"type":"null","description":"The app's slug (`hubspot`); for a tool server, the slug it was registered under.","isRequired":true,"uniqueKey":"data.oneOf.1.app.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.oneOf.1.app","typeLabel":"string | null"},"kind":{"type":"string","enum":["composio","key"],"description":"`composio` — the credential is held at Composio; `key` — a raw key the egress gateway injects on `baseUrl`'s host.","isRequired":true,"uniqueKey":"data.oneOf.1.kind","typeLabel":"enum\u003cstring>"},"baseUrl":{"oneOf":[{"type":"string","description":"A `key` connection's base URL. Null on a `composio` one.","isRequired":true,"uniqueKey":"data.oneOf.1.baseUrl.oneOf.0","typeLabel":"string"},{"type":"null","description":"A `key` connection's base URL. Null on a `composio` one.","isRequired":true,"uniqueKey":"data.oneOf.1.baseUrl.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.oneOf.1.baseUrl","typeLabel":"string | null"},"name":{"type":"string","description":"What the organization calls it. Unique per kind.","isRequired":true,"uniqueKey":"data.oneOf.1.name","typeLabel":"string"},"description":{"oneOf":[{"type":"string","description":"What it is for, in an operator's own words.","isRequired":true,"uniqueKey":"data.oneOf.1.description.oneOf.0","typeLabel":"string"},{"type":"null","description":"What it is for, in an operator's own words.","isRequired":true,"uniqueKey":"data.oneOf.1.description.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.oneOf.1.description","typeLabel":"string | null"},"status":{"type":"string","enum":["pending","active","expired","failed","revoked"],"description":"`pending` until a hosted sign-in finishes; `active` once the credential works.","isRequired":true,"uniqueKey":"data.oneOf.1.status","typeLabel":"enum\u003cstring>"},"managed":{"type":"boolean","description":"Provided by Ergoly. Readable; every change is refused.","isRequired":true,"uniqueKey":"data.oneOf.1.managed","typeLabel":"boolean"},"placements":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"The placement's id. What `DELETE …/placements/{pid}` takes.","isRequired":true,"uniqueKey":"data.oneOf.1.placements.items.[INDEX].id","typeLabel":"string"},"tier":{"type":"string","enum":["org","worker","client","instance"],"description":"`org` is the whole company; `worker` one Worker; `client` one Client, on every Worker serving it; `instance` one Worker for one Client.","isRequired":true,"uniqueKey":"data.oneOf.1.placements.items.[INDEX].tier","typeLabel":"enum\u003cstring>"},"workerId":{"oneOf":[{"type":"string","description":"The Worker, on a `worker` or `instance` placement.","isRequired":true,"uniqueKey":"data.oneOf.1.placements.items.[INDEX].workerId.oneOf.0","typeLabel":"string"},{"type":"null","description":"The Worker, on a `worker` or `instance` placement.","isRequired":true,"uniqueKey":"data.oneOf.1.placements.items.[INDEX].workerId.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.oneOf.1.placements.items.[INDEX].workerId","typeLabel":"string | null"},"clientId":{"oneOf":[{"type":"string","description":"The Client, on a `client` or `instance` placement.","isRequired":true,"uniqueKey":"data.oneOf.1.placements.items.[INDEX].clientId.oneOf.0","typeLabel":"string"},{"type":"null","description":"The Client, on a `client` or `instance` placement.","isRequired":true,"uniqueKey":"data.oneOf.1.placements.items.[INDEX].clientId.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.oneOf.1.placements.items.[INDEX].clientId","typeLabel":"string | null"},"workerName":{"oneOf":[{"type":"string","description":"That Worker's display name, when the caller supplied a directory.","isRequired":true,"uniqueKey":"data.oneOf.1.placements.items.[INDEX].workerName.oneOf.0","typeLabel":"string"},{"type":"null","description":"That Worker's display name, when the caller supplied a directory.","isRequired":true,"uniqueKey":"data.oneOf.1.placements.items.[INDEX].workerName.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.oneOf.1.placements.items.[INDEX].workerName","typeLabel":"string | null"},"clientName":{"oneOf":[{"type":"string","description":"That Client's name, when the caller supplied a directory.","isRequired":true,"uniqueKey":"data.oneOf.1.placements.items.[INDEX].clientName.oneOf.0","typeLabel":"string"},{"type":"null","description":"That Client's name, when the caller supplied a directory.","isRequired":true,"uniqueKey":"data.oneOf.1.placements.items.[INDEX].clientName.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.oneOf.1.placements.items.[INDEX].clientName","typeLabel":"string | null"}},"required":["id","tier","workerId","clientId","workerName","clientName"],"additionalProperties":false,"uniqueKey":"data.oneOf.1.placements.items.[INDEX]","typeLabel":"object"},"description":"Where it may be used. A connection with none is used by nobody.","isRequired":true,"uniqueKey":"data.oneOf.1.placements","typeLabel":"object[]"},"details":{"type":"object","description":"What is known about the account behind the connection, as last checked. Never a credential.","properties":{"authKind":{"type":"string","enum":["managed_sign_in","own_app_sign_in","key","dcr","no_auth","unknown"],"description":"How it authenticates: a hosted sign-in on Composio's or Ergoly's app; a sign-in on the organization's own OAuth app; a pasted key; a sign-in a tool server registered dynamically; no credential at all; or not checked yet.","isRequired":true,"uniqueKey":"data.oneOf.1.details.authKind","typeLabel":"enum\u003cstring>"},"authKindLabel":{"type":"string","description":"`authKind`, in words.","isRequired":true,"uniqueKey":"data.oneOf.1.details.authKindLabel","typeLabel":"string"},"identity":{"oneOf":[{"type":"object","description":"The account that signed in, where the app reported one. Null when it did not.","properties":{"kind":{"type":"string","enum":["email","login","name","workspace","account"],"description":"What kind of identifier `label` is.","isRequired":true,"uniqueKey":"data.oneOf.1.details.identity.oneOf.0.kind","typeLabel":"enum\u003cstring>"},"label":{"type":"string","description":"Who signed in, as the app reported it.","isRequired":true,"uniqueKey":"data.oneOf.1.details.identity.oneOf.0.label","typeLabel":"string"}},"required":["kind","label"],"additionalProperties":false,"isRequired":true,"uniqueKey":"data.oneOf.1.details.identity.oneOf.0","typeLabel":"object"},{"type":"null","description":"The account that signed in, where the app reported one. Null when it did not.","properties":{"kind":{"type":"string","enum":["email","login","name","workspace","account"],"description":"What kind of identifier `label` is."},"label":{"type":"string","description":"Who signed in, as the app reported it."}},"required":["kind","label"],"additionalProperties":false,"isRequired":true,"uniqueKey":"data.oneOf.1.details.identity.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.oneOf.1.details.identity","typeLabel":"object | null"},"scopes":{"type":"array","items":{"type":"string","description":"A scope, as the app spells it.","uniqueKey":"data.oneOf.1.details.scopes.items.[INDEX]","typeLabel":"string"},"description":"What the app granted, where the record carried it.","isRequired":true,"uniqueKey":"data.oneOf.1.details.scopes","typeLabel":"string[]"},"composioStatus":{"oneOf":[{"type":"string","description":"Composio's own status word for the account (`ACTIVE`, `EXPIRED`, …).","isRequired":true,"uniqueKey":"data.oneOf.1.details.composioStatus.oneOf.0","typeLabel":"string"},{"type":"null","description":"Composio's own status word for the account (`ACTIVE`, `EXPIRED`, …).","isRequired":true,"uniqueKey":"data.oneOf.1.details.composioStatus.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.oneOf.1.details.composioStatus","typeLabel":"string | null"},"statusReason":{"oneOf":[{"type":"string","description":"Why the status last changed, when Composio said.","isRequired":true,"uniqueKey":"data.oneOf.1.details.statusReason.oneOf.0","typeLabel":"string"},{"type":"null","description":"Why the status last changed, when Composio said.","isRequired":true,"uniqueKey":"data.oneOf.1.details.statusReason.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.oneOf.1.details.statusReason","typeLabel":"string | null"},"expiresAt":{"oneOf":[{"type":"string","format":"date-time","description":"When the credential expires or expired, when the app said.","isRequired":true,"uniqueKey":"data.oneOf.1.details.expiresAt.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"When the credential expires or expired, when the app said.","isRequired":true,"uniqueKey":"data.oneOf.1.details.expiresAt.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.oneOf.1.details.expiresAt","typeLabel":"string\u003cdate-time> | null"},"checkedAt":{"oneOf":[{"type":"string","format":"date-time","description":"When these facts were last checked. Null when never.","isRequired":true,"uniqueKey":"data.oneOf.1.details.checkedAt.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"When these facts were last checked. Null when never.","isRequired":true,"uniqueKey":"data.oneOf.1.details.checkedAt.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.oneOf.1.details.checkedAt","typeLabel":"string\u003cdate-time> | null"},"logo":{"oneOf":[{"type":"string","description":"The app's brand mark.","isRequired":true,"uniqueKey":"data.oneOf.1.details.logo.oneOf.0","typeLabel":"string"},{"type":"null","description":"The app's brand mark.","isRequired":true,"uniqueKey":"data.oneOf.1.details.logo.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.oneOf.1.details.logo","typeLabel":"string | null"},"appName":{"oneOf":[{"type":"string","description":"The app's own name in the catalog.","isRequired":true,"uniqueKey":"data.oneOf.1.details.appName.oneOf.0","typeLabel":"string"},{"type":"null","description":"The app's own name in the catalog.","isRequired":true,"uniqueKey":"data.oneOf.1.details.appName.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.oneOf.1.details.appName","typeLabel":"string | null"},"category":{"type":"string","description":"The one heading it is grouped under: what Composio files the app under, `MCP` for a tool server the organization registered, `Other` when nothing is known.","isRequired":true,"uniqueKey":"data.oneOf.1.details.category","typeLabel":"string"},"check":{"oneOf":[{"type":"object","description":"What the entry check of a pasted key found. Null when there was no key to check (a sign-in, a tool server that takes none) or the connection predates the record.","properties":{"verified":{"type":"boolean","description":"True only when one real call proved the key: the app accepted a test request with it and refused the same request without it.","isRequired":true,"uniqueKey":"data.oneOf.1.details.check.oneOf.0.verified","typeLabel":"boolean"},"reason":{"type":"string","enum":["key_proven","no_check_available","endpoint_accepts_anything","test_endpoint_missing","check_got_no_answer","key_rejected","test_request_forbidden","request_refused"],"description":"What the entry check got. `key_proven` is the only reason behind `verified: true`. `no_check_available`: no test exists for this kind of connection (every tool server's key). `endpoint_accepts_anything`: the app answers the same with and without the key. `test_endpoint_missing`: the app does not serve the address the test went to, a fault in the platform's test. `check_got_no_answer`: a 5xx, a rate limit or no answer at all. `test_request_forbidden`: the app knows the key but refused the test request (403), often because the test asks for more access than the key has; the key is saved unconfirmed. None of these is a rejected key — a rejected (`key_rejected`) or refused (`request_refused`) key fails the create and stores nothing, so neither appears on a listed connection.","isRequired":true,"uniqueKey":"data.oneOf.1.details.check.oneOf.0.reason","typeLabel":"enum\u003cstring>"},"at":{"type":"string","format":"date-time","description":"When the check ran.","isRequired":true,"uniqueKey":"data.oneOf.1.details.check.oneOf.0.at","typeLabel":"string\u003cdate-time>"}},"required":["verified","reason","at"],"additionalProperties":false,"isRequired":true,"uniqueKey":"data.oneOf.1.details.check.oneOf.0","typeLabel":"object"},{"type":"null","description":"What the entry check of a pasted key found. Null when there was no key to check (a sign-in, a tool server that takes none) or the connection predates the record.","properties":{"verified":{"type":"boolean","description":"True only when one real call proved the key: the app accepted a test request with it and refused the same request without it."},"reason":{"type":"string","enum":["key_proven","no_check_available","endpoint_accepts_anything","test_endpoint_missing","check_got_no_answer","key_rejected","test_request_forbidden","request_refused"],"description":"What the entry check got. `key_proven` is the only reason behind `verified: true`. `no_check_available`: no test exists for this kind of connection (every tool server's key). `endpoint_accepts_anything`: the app answers the same with and without the key. `test_endpoint_missing`: the app does not serve the address the test went to, a fault in the platform's test. `check_got_no_answer`: a 5xx, a rate limit or no answer at all. `test_request_forbidden`: the app knows the key but refused the test request (403), often because the test asks for more access than the key has; the key is saved unconfirmed. None of these is a rejected key — a rejected (`key_rejected`) or refused (`request_refused`) key fails the create and stores nothing, so neither appears on a listed connection."},"at":{"type":"string","format":"date-time","description":"When the check ran."}},"required":["verified","reason","at"],"additionalProperties":false,"isRequired":true,"uniqueKey":"data.oneOf.1.details.check.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.oneOf.1.details.check","typeLabel":"object | null"}},"required":["authKind","authKindLabel","identity","scopes","composioStatus","statusReason","expiresAt","checkedAt","logo","appName","category","check"],"additionalProperties":false,"isRequired":true,"uniqueKey":"data.oneOf.1.details","typeLabel":"object"},"createdAt":{"type":"string","format":"date-time","description":"When it was created.","isRequired":true,"uniqueKey":"data.oneOf.1.createdAt","typeLabel":"string\u003cdate-time>"},"lastUsedAt":{"oneOf":[{"type":"string","format":"date-time","description":"When a tool last ran through it. Null until one has.","isRequired":true,"uniqueKey":"data.oneOf.1.lastUsedAt.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"When a tool last ran through it. Null until one has.","isRequired":true,"uniqueKey":"data.oneOf.1.lastUsedAt.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.oneOf.1.lastUsedAt","typeLabel":"string\u003cdate-time> | null"},"sessions":{"type":"array","items":{"type":"object","properties":{"eworkId":{"type":"string","description":"The ework whose session this row describes.","isRequired":true,"uniqueKey":"data.oneOf.1.sessions.items.[INDEX].eworkId","typeLabel":"string"},"outcome":{"type":"string","enum":["created","patched","unchanged","deleted","none","no_project","not_configured","not_live","failed"],"description":"What happened to its session. `none` means nothing there needed touching; `failed` carries `error`.","isRequired":true,"uniqueKey":"data.oneOf.1.sessions.items.[INDEX].outcome","typeLabel":"enum\u003cstring>"},"gained":{"type":"array","items":{"type":"string","description":"A connection id.","uniqueKey":"data.oneOf.1.sessions.items.[INDEX].gained.items.[INDEX]","typeLabel":"string"},"description":"Connections it can use now that it could not before.","isRequired":true,"uniqueKey":"data.oneOf.1.sessions.items.[INDEX].gained","typeLabel":"string[]"},"lost":{"type":"array","items":{"type":"string","description":"A connection id.","uniqueKey":"data.oneOf.1.sessions.items.[INDEX].lost.items.[INDEX]","typeLabel":"string"},"description":"Connections it could use before and cannot now.","isRequired":true,"uniqueKey":"data.oneOf.1.sessions.items.[INDEX].lost","typeLabel":"string[]"},"sessionId":{"oneOf":[{"type":"string","description":"Its session at Composio, when it has one.","isRequired":true,"uniqueKey":"data.oneOf.1.sessions.items.[INDEX].sessionId.oneOf.0","typeLabel":"string"},{"type":"null","description":"Its session at Composio, when it has one.","isRequired":true,"uniqueKey":"data.oneOf.1.sessions.items.[INDEX].sessionId.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.oneOf.1.sessions.items.[INDEX].sessionId","typeLabel":"string | null"},"error":{"type":"string","description":"Why, when `outcome` is `failed`.","uniqueKey":"data.oneOf.1.sessions.items.[INDEX].error","typeLabel":"string"}},"required":["eworkId","outcome","gained","lost","sessionId"],"additionalProperties":false,"uniqueKey":"data.oneOf.1.sessions.items.[INDEX]","typeLabel":"object"},"description":"One report per ework the placement reached.","isRequired":true,"uniqueKey":"data.oneOf.1.sessions","typeLabel":"object[]"},"connectUrl":{"type":"string","description":"The hosted sign-in to open in a browser, on an OAuth create. SHOWN ONCE: a replay under the same Idempotency-Key withholds it and names it in `secretsWithheld`.","uniqueKey":"data.oneOf.1.connectUrl","typeLabel":"string"},"verified":{"type":"boolean","description":"On a pasted key: whether one real call proved it. `false` means it was stored and could not be checked, not that it is wrong.","uniqueKey":"data.oneOf.1.verified","typeLabel":"boolean"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"data.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"data","typeLabel":"object"}},"required":["data"],"additionalProperties":false,"uniqueKey":"","typeLabel":"object"},"example":{"data":{"id":"6d5c4b3a-2918-4706-9f8e-1d2c3b4a5968","key":"stripe_live","kind":"api_key","type":"secret","scope":"org","workerId":null,"clientId":null,"internalOnly":false,"managed":false,"hosts":["api.stripe.com"],"description":"Billing — subscriptions, invoices and refunds.","provider":null,"account":null,"providerScopes":[],"expiresAt":null,"health":null,"issuer":null,"issuerHost":null,"mcpEndpoint":null,"mcpTransport":null,"mcpTools":[],"mcpStatus":null,"mcpServerName":null,"providerClientId":null,"redirectUri":null,"createdAt":"2026-02-01T09:14:00.000Z","updatedAt":"2026-02-01T09:14:00.000Z"}},"examples":{"Example":{"title":"Example","value":{"data":{"id":"6d5c4b3a-2918-4706-9f8e-1d2c3b4a5968","key":"stripe_live","kind":"api_key","type":"secret","scope":"org","workerId":null,"clientId":null,"internalOnly":false,"managed":false,"hosts":["api.stripe.com"],"description":"Billing — subscriptions, invoices and refunds.","provider":null,"account":null,"providerScopes":[],"expiresAt":null,"health":null,"issuer":null,"issuerHost":null,"mcpEndpoint":null,"mcpTransport":null,"mcpTools":[],"mcpStatus":null,"mcpServerName":null,"providerClientId":null,"redirectUri":null,"createdAt":"2026-02-01T09:14:00.000Z","updatedAt":"2026-02-01T09:14:00.000Z"}}}},"exampleType":"examples"}},"exampleType":"examples"},"9461d4db-5a1a-4f2b-aff8-7601a88aa0a6":{"description":"`invalid_request`","content":{"application/json":{"schema":{"type":"object","description":"The one error shape. Every refusal in this namespace has it.","properties":{"error":{"type":"object","description":"The refusal.","properties":{"code":{"type":"string","enum":["unauthorized","not_found","invalid_request","conflict","quota_exceeded","rate_limited","upstream_error","gone"],"description":"The machine-stable half. Branch on this, never on `message`.","isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"Prose for a human reading a terminal.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"docs":{"type":"string","description":"Where to learn how to authenticate. Present on `unauthorized` and on nothing else — it is the one refusal a caller can reach with no credential at all, so it is the one that has to say where the way in is.","uniqueKey":"error.docs","typeLabel":"string"}},"required":["code","message"],"additionalProperties":false,"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"additionalProperties":false,"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"unauthorized","message":"\u003cstring>","docs":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"},"d26c0e10-e8d3-4286-9043-5bd172829397":{"description":"`unauthorized`","content":{"application/json":{"schema":{"type":"object","description":"The one error shape. Every refusal in this namespace has it.","properties":{"error":{"type":"object","description":"The refusal.","properties":{"code":{"type":"string","enum":["unauthorized","not_found","invalid_request","conflict","quota_exceeded","rate_limited","upstream_error","gone"],"description":"The machine-stable half. Branch on this, never on `message`.","isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"Prose for a human reading a terminal.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"docs":{"type":"string","description":"Where to learn how to authenticate. Present on `unauthorized` and on nothing else — it is the one refusal a caller can reach with no credential at all, so it is the one that has to say where the way in is.","uniqueKey":"error.docs","typeLabel":"string"}},"required":["code","message"],"additionalProperties":false,"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"additionalProperties":false,"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"unauthorized","message":"\u003cstring>","docs":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"},"898d90c9-bcf1-4c07-89fa-9c0c4a5e8ba3":{"description":"`not_found`","content":{"application/json":{"schema":{"type":"object","description":"The one error shape. Every refusal in this namespace has it.","properties":{"error":{"type":"object","description":"The refusal.","properties":{"code":{"type":"string","enum":["unauthorized","not_found","invalid_request","conflict","quota_exceeded","rate_limited","upstream_error","gone"],"description":"The machine-stable half. Branch on this, never on `message`.","isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"Prose for a human reading a terminal.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"docs":{"type":"string","description":"Where to learn how to authenticate. Present on `unauthorized` and on nothing else — it is the one refusal a caller can reach with no credential at all, so it is the one that has to say where the way in is.","uniqueKey":"error.docs","typeLabel":"string"}},"required":["code","message"],"additionalProperties":false,"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"additionalProperties":false,"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"unauthorized","message":"\u003cstring>","docs":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"},"f7488675-4947-4838-814b-30b078633654":{"description":"`conflict`","content":{"application/json":{"schema":{"type":"object","description":"The one error shape. Every refusal in this namespace has it.","properties":{"error":{"type":"object","description":"The refusal.","properties":{"code":{"type":"string","enum":["unauthorized","not_found","invalid_request","conflict","quota_exceeded","rate_limited","upstream_error","gone"],"description":"The machine-stable half. Branch on this, never on `message`.","isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"Prose for a human reading a terminal.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"docs":{"type":"string","description":"Where to learn how to authenticate. Present on `unauthorized` and on nothing else — it is the one refusal a caller can reach with no credential at all, so it is the one that has to say where the way in is.","uniqueKey":"error.docs","typeLabel":"string"}},"required":["code","message"],"additionalProperties":false,"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"additionalProperties":false,"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"unauthorized","message":"\u003cstring>","docs":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"},"1c040881-10c5-4c76-873d-b26408b104d6":{"description":"`rate_limited`","content":{"application/json":{"schema":{"type":"object","description":"The one error shape. Every refusal in this namespace has it.","properties":{"error":{"type":"object","description":"The refusal.","properties":{"code":{"type":"string","enum":["unauthorized","not_found","invalid_request","conflict","quota_exceeded","rate_limited","upstream_error","gone"],"description":"The machine-stable half. Branch on this, never on `message`.","isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"Prose for a human reading a terminal.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"docs":{"type":"string","description":"Where to learn how to authenticate. Present on `unauthorized` and on nothing else — it is the one refusal a caller can reach with no credential at all, so it is the one that has to say where the way in is.","uniqueKey":"error.docs","typeLabel":"string"}},"required":["code","message"],"additionalProperties":false,"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"additionalProperties":false,"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"unauthorized","message":"\u003cstring>","docs":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"},"d5d3837d-1094-4485-9d3c-3b75b90904bb":{"description":"`upstream_error`","content":{"application/json":{"schema":{"type":"object","description":"The one error shape. Every refusal in this namespace has it.","properties":{"error":{"type":"object","description":"The refusal.","properties":{"code":{"type":"string","enum":["unauthorized","not_found","invalid_request","conflict","quota_exceeded","rate_limited","upstream_error","gone"],"description":"The machine-stable half. Branch on this, never on `message`.","isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"Prose for a human reading a terminal.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"docs":{"type":"string","description":"Where to learn how to authenticate. Present on `unauthorized` and on nothing else — it is the one refusal a caller can reach with no credential at all, so it is the one that has to say where the way in is.","uniqueKey":"error.docs","typeLabel":"string"}},"required":["code","message"],"additionalProperties":false,"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"additionalProperties":false,"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"unauthorized","message":"\u003cstring>","docs":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"fa9f6d19-44d1-48dd-b73d-369a996d1cdc":{"orgApiKey":{"type":"http","scheme":"bearer","description":"An organization-scoped API key, minted in control under Settings → API keys. Every failure to authenticate answers one identical 401: \"Provide a valid organization-scoped API key or an active session.\" Each operation names the one scope it is filed under, `\u003cresource>:\u003cread|write>`, where the resource is the first path segment after `/api/v1/`; a key minted today carries all 22 of them. Scopes are RECORDED — on the key and on every audit row — and are not yet enforced: no request is refused for want of one.","scopes":["connections:write"],"schemeName":"orgApiKey"}}},"servers":{"15355b2c-94fb-418f-acf2-2e27904062bb":{"url":"https://control.ergoly.ai"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","description":"An organization-scoped API key, minted in control under Settings → API keys. Every failure to authenticate answers one identical 401: \"Provide a valid organization-scoped API key or an active session.\" Each operation names the one scope it is filed under, `\u003cresource>:\u003cread|write>`, where the resource is the first path segment after `/api/v1/`; a key minted today carries all 22 of them. Scopes are RECORDED — on the key and on every audit row — and are not yet enforced: no request is refused for want of one.","scopes":["connections:write"],"schemeName":"orgApiKey"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"An organization-scoped API key, minted in control under Settings → API keys. Every failure to authenticate answers one identical 401: \"Provide a valid organization-scoped API key or an active session.\" Each operation names the one scope it is filed under, `\u003cresource>:\u003cread|write>`, where the resource is the first path segment after `/api/v1/`; a key minted today carries all 22 of them. Scopes are RECORDED — on the key and on every audit row — and are not yet enforced: no request is refused for want of one.","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"orgApiKey","name":"Authorization"}],"title":"orgApiKey"}]},"originalFileLocation":"openapi.json"},"subdomain":"ergoly","siteName":"Ergoly","title":"Create a connection - Ergoly","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-09T02:24:49.132Z","originalFileLocation":"api-reference/connections/create-a-connection.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=\"Two shapes, told apart by app. WITHOUT it, this stores a secret: value is write-only, it goes in here and no route gives it back; give at least one host unless the key already has some — a credential no host points at is never injected by the gateway, so it would sit there doing nothing; a key already taken at the same scope is a conflict, as is a host already mapped to another connection. WITH app — a catalog slug or a tool server\u0026#x27;s URL — this connects an app and places it: omit auth and the answer carries connectUrl, a hosted sign-in to open in a browser, with the connection pending until consent finishes and active after (poll GET /api/v1/connections/{id}); send auth.mode: \u0026quot;key\u0026quot; with the key in value and it is stored at Composio and checked with one real call, verified reporting the verdict; a tool server that takes a key names the header it goes in with auth.header (absent is Authorization, sent as Bearer ; any other header carries the key on its own); a tool server that takes no credential is auth.mode: \u0026quot;none\u0026quot;, and gets a row and a placement with nothing stored anywhere. A placement no ework could read — instance on a Worker with no active ework for that Client, client for a Client no Worker has one for — is a conflict naming the pair, refused before a key or a sign-in reaches Composio. The check is made once, up front: an ework removed while Composio is being called can still leave the placement in place, and adding or moving a placement later is checked again at the write. connectUrl is shown once — a replay under the same Idempotency-Key withholds it — and the pasted key is never in any response. sessions says which eworks can use the app now.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Ergoly\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/ergoly/OjkmtN-S1YevUC4M/_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/ergoly/OjkmtN-S1YevUC4M/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/ergoly/OjkmtN-S1YevUC4M/_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/ergoly/OjkmtN-S1YevUC4M/_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/ergoly/OjkmtN-S1YevUC4M/_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/ergoly/OjkmtN-S1YevUC4M/_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/ergoly/OjkmtN-S1YevUC4M/_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/ergoly/OjkmtN-S1YevUC4M/_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/ergoly/OjkmtN-S1YevUC4M/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Create a connection - Ergoly\">\u003cmeta data-mint-head property=\"og:description\" content=\"Two shapes, told apart by app. WITHOUT it, this stores a secret: value is write-only, it goes in here and no route gives it back; give at least one host unless the key already has some — a credential no host points at is never injected by the gateway, so it would sit there doing nothing; a key already taken at the same scope is a conflict, as is a host already mapped to another connection. WITH app — a catalog slug or a tool server\u0026#x27;s URL — this connects an app and places it: omit auth and the answer carries connectUrl, a hosted sign-in to open in a browser, with the connection pending until consent finishes and active after (poll GET /api/v1/connections/{id}); send auth.mode: \u0026quot;key\u0026quot; with the key in value and it is stored at Composio and checked with one real call, verified reporting the verdict; a tool server that takes a key names the header it goes in with auth.header (absent is Authorization, sent as Bearer ; any other header carries the key on its own); a tool server that takes no credential is auth.mode: \u0026quot;none\u0026quot;, and gets a row and a placement with nothing stored anywhere. A placement no ework could read — instance on a Worker with no active ework for that Client, client for a Client no Worker has one for — is a conflict naming the pair, refused before a key or a sign-in reaches Composio. The check is made once, up front: an ework removed while Composio is being called can still leave the placement in place, and adding or moving a placement later is checked again at the write. connectUrl is shown once — a replay under the same Idempotency-Key withholds it — and the pasted key is never in any response. sessions says which eworks can use the app now.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Ergoly\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.ergoly.ai/api-reference/connections/create-a-connection\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://ergoly.mintlify.site/_mintlify/api/og/v2?division=Connections\u0026amp;title=Create+a+connection\u0026amp;description=Two+shapes%2C+told+apart+by+%60app%60.+WITHOUT+it%2C+this+stores+a+secret%3A+%60value%60+is+write-only%2C+it+goes+in+here+and+no+route+gives+it+back%3B+give+at+least+one+host+unl\u0026amp;theme=46f41713e7d152b6296bdf32\u0026amp;signature=b1f2140e3ebaa7227e82cadc651895ea702290ff7ef6e7466cea79e1427a2109\">\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=\"Create a connection - Ergoly\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Two shapes, told apart by app. WITHOUT it, this stores a secret: value is write-only, it goes in here and no route gives it back; give at least one host unless the key already has some — a credential no host points at is never injected by the gateway, so it would sit there doing nothing; a key already taken at the same scope is a conflict, as is a host already mapped to another connection. WITH app — a catalog slug or a tool server\u0026#x27;s URL — this connects an app and places it: omit auth and the answer carries connectUrl, a hosted sign-in to open in a browser, with the connection pending until consent finishes and active after (poll GET /api/v1/connections/{id}); send auth.mode: \u0026quot;key\u0026quot; with the key in value and it is stored at Composio and checked with one real call, verified reporting the verdict; a tool server that takes a key names the header it goes in with auth.header (absent is Authorization, sent as Bearer ; any other header carries the key on its own); a tool server that takes no credential is auth.mode: \u0026quot;none\u0026quot;, and gets a row and a placement with nothing stored anywhere. A placement no ework could read — instance on a Worker with no active ework for that Client, client for a Client no Worker has one for — is a conflict naming the pair, refused before a key or a sign-in reaches Composio. The check is made once, up front: an ework removed while Composio is being called can still leave the placement in place, and adding or moving a placement later is checked again at the write. connectUrl is shown once — a replay under the same Idempotency-Key withholds it — and the pasted key is never in any response. sessions says which eworks can use the app now.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://ergoly.mintlify.site/_mintlify/api/og/v2?division=Connections\u0026amp;title=Create+a+connection\u0026amp;description=Two+shapes%2C+told+apart+by+%60app%60.+WITHOUT+it%2C+this+stores+a+secret%3A+%60value%60+is+write-only%2C+it+goes+in+here+and+no+route+gives+it+back%3B+give+at+least+one+host+unl\u0026amp;theme=46f41713e7d152b6296bdf32\u0026amp;signature=b1f2140e3ebaa7227e82cadc651895ea702290ff7ef6e7466cea79e1427a2109\">\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/ergoly/OjkmtN-S1YevUC4M/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Ergoly\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#079b9b\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.ergoly.ai/api-reference/connections/create-a-connection\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/connections/create-a-connection.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.ergoly.ai/#organization\",\"name\":\"Ergoly\",\"url\":\"https://docs.ergoly.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/ergoly/-drdYd6uXChmiNIn/logo/light.png?fit=max\u0026auto=format\u0026n=-drdYd6uXChmiNIn\u0026q=85\u0026s=a9084e9caaf8656a821bf02426e31c05\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.ergoly.ai#website\",\"name\":\"Ergoly\",\"url\":\"https://docs.ergoly.ai\",\"publisher\":{\"@id\":\"https://docs.ergoly.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.ergoly.ai/api-reference/connections/create-a-connection#webpage\",\"url\":\"https://docs.ergoly.ai/api-reference/connections/create-a-connection\",\"name\":\"Create a connection\",\"description\":\"Two shapes, told apart by app. WITHOUT it, this stores a secret: value is write-only, it goes in here and no route gives it back; give at least one host unless the key already has some — a credential no host points at is never injected by the gateway, so it would sit there doing nothing; a key already taken at the same scope is a conflict, as is a host already mapped to another connection. WITH app — a catalog slug or a tool server's URL — this connects an app and places it: omit auth and the answer carries connectUrl, a hosted sign-in to open in a browser, with the connection pending until consent finishes and active after (poll GET /api/v1/connections/{id}); send auth.mode: \\\"key\\\" with the key in value and it is stored at Composio and checked with one real call, verified reporting the verdict; a tool server that takes a key names the header it goes in with auth.header (absent is Authorization, sent as Bearer ; any other header carries the key on its own); a tool server that takes no credential is auth.mode: \\\"none\\\", and gets a row and a placement with nothing stored anywhere. A placement no ework could read — instance on a Worker with no active ework for that Client, client for a Client no Worker has one for — is a conflict naming the pair, refused before a key or a sign-in reaches Composio. The check is made once, up front: an ework removed while Composio is being called can still leave the placement in place, and adding or moving a placement later is checked again at the write. connectUrl is shown once — a replay under the same Idempotency-Key withholds it — and the pasted key is never in any response. sessions says which eworks can use the app now.\",\"dateModified\":\"2026-11-09T02:24:49.132Z\",\"isPartOf\":{\"@id\":\"https://docs.ergoly.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.ergoly.ai/api-reference/connections/create-a-connection#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.ergoly.ai/api-reference/connections/create-a-connection#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Connections\",\"item\":\"https://docs.ergoly.ai/api-reference/connections/list-connections\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Create a connection\",\"item\":\"https://docs.ergoly.ai/api-reference/connections/create-a-connection\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.ergoly.ai/api-reference/connections/create-a-connection#apireference\",\"headline\":\"Create a connection\",\"name\":\"Create a connection\",\"description\":\"Two shapes, told apart by app. WITHOUT it, this stores a secret: value is write-only, it goes in here and no route gives it back; give at least one host unless the key already has some — a credential no host points at is never injected by the gateway, so it would sit there doing nothing; a key already taken at the same scope is a conflict, as is a host already mapped to another connection. WITH app — a catalog slug or a tool server's URL — this connects an app and places it: omit auth and the answer carries connectUrl, a hosted sign-in to open in a browser, with the connection pending until consent finishes and active after (poll GET /api/v1/connections/{id}); send auth.mode: \\\"key\\\" with the key in value and it is stored at Composio and checked with one real call, verified reporting the verdict; a tool server that takes a key names the header it goes in with auth.header (absent is Authorization, sent as Bearer ; any other header carries the key on its own); a tool server that takes no credential is auth.mode: \\\"none\\\", and gets a row and a placement with nothing stored anywhere. A placement no ework could read — instance on a Worker with no active ework for that Client, client for a Client no Worker has one for — is a conflict naming the pair, refused before a key or a sign-in reaches Composio. The check is made once, up front: an ework removed while Composio is being called can still leave the placement in place, and adding or moving a placement later is checked again at the write. connectUrl is shown once — a replay under the same Idempotency-Key withholds it — and the pasted key is never in any response. sessions says which eworks can use the app now.\",\"url\":\"https://docs.ergoly.ai/api-reference/connections/create-a-connection\",\"mainEntityOfPage\":{\"@id\":\"https://docs.ergoly.ai/api-reference/connections/create-a-connection#webpage\"},\"dateModified\":\"2026-11-09T02:24:49.132Z\",\"publisher\":{\"@id\":\"https://docs.ergoly.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.ergoly.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Ergoly\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Ergoly","nav":{"global":null,"tabs":[{"tab":"Docs","icon":"book-open","pages":[{"title":"Docs","href":""}]},{"tab":"Changelog","icon":"sparkles","pages":[{"title":"Changelog","href":"/changelog"}]},{"tab":"API","icon":"user-robot","groups":[{"group":"Getting started","pages":[{"title":"Introduction","href":"/api-reference/introduction"},{"title":"The API","href":"/technical/api"}]},{"group":"Company","pages":[{"title":"Get your company","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/organization","href":"/api-reference/organization/get-your-company"},{"title":"List chart placements","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/company/placements","href":"/api-reference/workers/list-chart-placements"},{"title":"Get the activity feed","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/activity","href":"/api-reference/activity/get-the-activity-feed"},{"title":"Get usage","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/usage","href":"/api-reference/usage/get-usage"}]},{"group":"Workers","pages":[{"title":"List workers","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/workers","href":"/api-reference/workers/list-workers"},{"title":"Create a worker","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/workers","href":"/api-reference/workers/create-a-worker"},{"title":"Get the current worker","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/workers/me","href":"/api-reference/workers/get-the-current-worker"},{"title":"Get a worker","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/workers/{id}","href":"/api-reference/workers/get-a-worker"},{"title":"Update a worker","deprecated":null,"version":null,"openapi":"/openapi.json patch /api/v1/workers/{id}","href":"/api-reference/workers/update-a-worker"},{"title":"Delete a worker","deprecated":null,"version":null,"openapi":"/openapi.json delete /api/v1/workers/{id}","href":"/api-reference/workers/delete-a-worker"},{"group":"Provisioning","pages":[{"title":"Retry provisioning","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/workers/{id}/retry","href":"/api-reference/workers/retry-provisioning"},{"title":"Stop a worker","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/workers/{id}/stop","href":"/api-reference/workers/stop-a-worker"},{"title":"Get a provisioning job","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/jobs/{id}","href":"/api-reference/jobs/get-a-provisioning-job"}]},{"group":"Copies (eworks)","pages":[{"title":"List a worker's copies","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/workers/{id}/eworks","href":"/api-reference/eworks/list-a-workers-copies"},{"title":"Get a copy","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/eworks/{id}","href":"/api-reference/eworks/get-a-copy"}]},{"group":"Memory","pages":[{"title":"Read a memory tier","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/eworks/{id}/memory","href":"/api-reference/memory/read-a-memory-tier"},{"title":"Write a file","deprecated":null,"version":null,"openapi":"/openapi.json put /api/v1/eworks/{id}/memory","href":"/api-reference/memory/write-a-file"},{"title":"Write several files","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/eworks/{id}/memory","href":"/api-reference/memory/write-several-files"},{"title":"Delete a file or folder","deprecated":null,"version":null,"openapi":"/openapi.json delete /api/v1/eworks/{id}/memory","href":"/api-reference/memory/delete-a-file-or-folder"}]}]},{"group":"Clients","pages":[{"title":"List clients","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/clients","href":"/api-reference/clients/list-clients"},{"title":"Create a client","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/clients","href":"/api-reference/clients/create-a-client"},{"title":"Get a client","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/clients/{id}","href":"/api-reference/clients/get-a-client"},{"title":"Update a client","deprecated":null,"version":null,"openapi":"/openapi.json patch /api/v1/clients/{id}","href":"/api-reference/clients/update-a-client"},{"title":"Assign a client to a worker","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/workers/{id}/clients","href":"/api-reference/clients/assign-a-client-to-a-worker"}]},{"group":"Channels","pages":[{"title":"List Slack channels","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/channels","href":"/api-reference/channels/list-slack-channels"},{"title":"Create a Slack channel","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/channels","href":"/api-reference/channels/create-a-slack-channel"},{"group":"Channel mappings","pages":[{"title":"List channel mappings","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/workers/{id}/channels","href":"/api-reference/channels/list-channel-mappings"},{"title":"Map a channel","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/workers/{id}/channels","href":"/api-reference/channels/map-a-channel"},{"title":"Classify a channel","deprecated":null,"version":null,"openapi":"/openapi.json patch /api/v1/workers/{id}/channels/{channel}","href":"/api-reference/channels/classify-a-channel"},{"title":"Unmap a channel","deprecated":null,"version":null,"openapi":"/openapi.json delete /api/v1/workers/{id}/channels/{channel}","href":"/api-reference/channels/unmap-a-channel"},{"title":"Invite a worker to a channel","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/workers/{id}/channels/{channel}/invite","href":"/api-reference/channels/invite-a-worker-to-a-channel"}]}]},{"group":"Tasks","pages":[{"title":"List tasks","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/tasks","href":"/api-reference/tasks/list-tasks"},{"title":"Create a task","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/tasks","href":"/api-reference/tasks/create-a-task"},{"title":"Get a task","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/tasks/{id}","href":"/api-reference/tasks/get-a-task"},{"title":"Hand off a task","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/tasks/{id}/handoff","href":"/api-reference/tasks/hand-off-a-task"},{"title":"Comment on a task","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/tasks/{id}/comments","href":"/api-reference/tasks/comment-on-a-task"},{"title":"Change a task's state","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/tasks/{id}/state","href":"/api-reference/tasks/change-a-tasks-state"},{"group":"Scheduled jobs (routines)","pages":[{"title":"Update a scheduled job","deprecated":null,"version":null,"openapi":"/openapi.json patch /api/v1/tasks/{id}","href":"/api-reference/tasks/update-a-scheduled-job"},{"title":"Cancel a scheduled job","deprecated":null,"version":null,"openapi":"/openapi.json delete /api/v1/tasks/{id}","href":"/api-reference/tasks/cancel-a-scheduled-job"},{"title":"List a job's runs","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/tasks/{id}/runs","href":"/api-reference/tasks/list-a-jobs-runs"},{"title":"Add a target","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/tasks/{id}/targets","href":"/api-reference/tasks/add-a-target"},{"title":"Remove a target","deprecated":null,"version":null,"openapi":"/openapi.json delete /api/v1/tasks/{id}/targets/{targetId}","href":"/api-reference/tasks/remove-a-target"}]}]},{"group":"Webhooks","pages":[{"title":"List webhooks","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/webhooks","href":"/api-reference/webhooks/list-webhooks"},{"title":"Create a webhook","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/webhooks","href":"/api-reference/webhooks/create-a-webhook"},{"title":"Get a webhook","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/webhooks/{id}","href":"/api-reference/webhooks/get-a-webhook"},{"title":"Update a webhook","deprecated":null,"version":null,"openapi":"/openapi.json patch /api/v1/webhooks/{id}","href":"/api-reference/webhooks/update-a-webhook"},{"title":"Revoke a webhook","deprecated":null,"version":null,"openapi":"/openapi.json delete /api/v1/webhooks/{id}","href":"/api-reference/webhooks/revoke-a-webhook"},{"title":"Rotate a webhook secret","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/webhooks/{id}/rotate","href":"/api-reference/webhooks/rotate-a-webhook-secret"},{"title":"List deliveries","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/webhooks/{id}/deliveries","href":"/api-reference/webhooks/list-deliveries"}]},{"group":"Connections","pages":[{"title":"List connections","description":"Newest first, across all four types. `workerId` and `clientId` narrow to connections scoped to exactly that Worker or Client — they do not answer what that Worker can resolve, so org-wide connections it also reaches are not included. `?view=apps` lists the CONNECTED APPS instead: each is an app a person signed in to or pasted a key for, placed at one or more tiers, and its `placements` say where it may be used. That view takes no scope filter. No entry in either list carries a stored value.","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/connections","href":"/api-reference/connections/list-connections"},{"title":"Create a connection","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/connections","href":"/api-reference/connections/create-a-connection"},{"title":"Get a connection","description":"Everything the Connections page shows for it, in whichever of the two shapes the id names: a stored secret's scope, hosts and connection state by `type`; or a connected app's `app`, `status` and `placements`. Nothing it does not: no stored value, no client secret, in any form. A well-formed id belonging to another organization is the same 404 as a malformed one, whichever store it lives in.","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/connections/{id}","href":"/api-reference/connections/get-a-connection"},{"title":"Update a connection","deprecated":null,"version":null,"openapi":"/openapi.json patch /api/v1/connections/{id}","href":"/api-reference/connections/update-a-connection"},{"title":"Delete a connection","deprecated":null,"version":null,"openapi":"/openapi.json delete /api/v1/connections/{id}","href":"/api-reference/connections/delete-a-connection"},{"title":"Rotate a connection","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/connections/{id}/rotate","href":"/api-reference/connections/rotate-a-connection"},{"group":"Hosts","pages":[{"title":"List hosts","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/connections/{id}/hosts","href":"/api-reference/connections/list-hosts"},{"title":"Add a host","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/connections/{id}/hosts","href":"/api-reference/connections/add-a-host"},{"title":"Remove a host","deprecated":null,"version":null,"openapi":"/openapi.json delete /api/v1/connections/{id}/hosts/{host}","href":"/api-reference/connections/remove-a-host"}]},{"group":"Connected apps","pages":[{"title":"Get a connect URL","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/connections/oauth/{provider}/connect-url","href":"/api-reference/connections/get-a-connect-url"},{"title":"Get a sign-in link","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/connections/{id}/connect-url","href":"/api-reference/connections/get-a-sign-in-link"},{"title":"Add a placement","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/connections/{id}/placements","href":"/api-reference/connections/add-a-placement"},{"title":"Remove a placement","deprecated":null,"version":null,"openapi":"/openapi.json delete /api/v1/connections/{id}/placements/{pid}","href":"/api-reference/connections/remove-a-placement"}]},{"group":"MCP servers","pages":[{"title":"Connect an MCP server","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/connections/mcp","href":"/api-reference/connections/connect-an-mcp-server"},{"title":"Finish an MCP connection","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/connections/mcp/{id}/finish","href":"/api-reference/connections/finish-an-mcp-connection"}]},{"group":"Provider apps","pages":[{"title":"Get a provider app","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/connections/provider-apps/{provider}","href":"/api-reference/connections/get-a-provider-app"},{"title":"Set a provider app","deprecated":null,"version":null,"openapi":"/openapi.json put /api/v1/connections/provider-apps/{provider}","href":"/api-reference/connections/set-a-provider-app"},{"title":"Delete a provider app","deprecated":null,"version":null,"openapi":"/openapi.json delete /api/v1/connections/provider-apps/{provider}","href":"/api-reference/connections/delete-a-provider-app"}]},{"group":"Your own OAuth client","pages":[{"title":"Get your OAuth client","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/oauth-apps/{app}","href":"/api-reference/connections/get-your-oauth-client"},{"title":"Set your OAuth client","deprecated":null,"version":null,"openapi":"/openapi.json put /api/v1/oauth-apps/{app}","href":"/api-reference/connections/set-your-oauth-client"},{"title":"Delete your OAuth client","deprecated":null,"version":null,"openapi":"/openapi.json delete /api/v1/oauth-apps/{app}","href":"/api-reference/connections/delete-your-oauth-client"}]}]}]}]},"basePath":"","title":"Create a connection - Ergoly","buildId":"dpl_DTau1J5HqS9UTgVSDwGksstFWtPa","deploymentId":"dpl_DTau1J5HqS9UTgVSDwGksstFWtPa","dynamics":["10e4515597","c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["BannerMarkdown-Cj6eAYhz.js","dist-CdrJecqK.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","clsx-D-TRO5q5.js","html-void-elements-mCSPHezU.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","OpenApiReferenceProvider-5FCzAcfS.js","utils-SLtAG4EZ.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-2DZi8ZMu.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-D7J3nkzE.js","snippetPresets-D0Alv0AH.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","conditional-requirements-CFM0id0Q.js","ApiExamples-BI4qNJ2c.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-BD3uyr8j.js","shallow-D8iEBr5z.js","getApiPlaygroundDisplay-CgNP4lzR.js","CodeSnippet-CX-QHuMs.js","CodeSnippets-VlXE-ZUf.js","Page-D9ithiIZ.js","getPastedJson-DYNQkZ1M.js","icon-CzacdwOi.js","MethodPill-2JVqoYKi.js","DuplicateIcon-_xVXs-U8.js","createIcon-BRHrweLo.js","DynamicMarkdown-mQG_iQiE.js","SectionHeading-DMpJzv8f.js","axios-vUo_bRtp.js","Markdown-5FGIym-8.js","AssistantPageLink-CHlcWBLM.js"]}