Let agents call approved HTTP APIs while Roomote keeps credentials server-side.
HTTP integrations let sessions and sandbox agents call an API without
receiving its credential. The agent chooses a configured integration, method,
path, and request body. Roomote checks the current actor’s access, attaches the
server-side credential, and sends the HTTPS request.This works through the same Roomote API for every sandbox provider, including
Modal, Docker, E2B, Daytona, Azure, Blaxel, and Box, as well as deployment-managed sandboxes. It requires no
provider-specific networking configuration or proxy service. Existing connected
integration tools remain available and should be used first.For a general “connect to X” request, Roomote checks the read-only built-in
catalog first, including disconnected providers. It uses that provider’s native
setup path when present, then checks for an official remote MCP server, and uses
HTTP integrations or an integration key only when neither applies. An MCP that
requires provider approval, an allowlisted client, a beta or plan, or a token
you hold is offered as an option rather than treated as immediately connectable.
An explicit request for direct API access keeps that choice. Discovery does not
start setup, and permission denials or pending or denied authorization are not
bypassed.
This is credential mediation, not network isolation. Agents are instructed to
use the integration tools, but normal sandbox networking remains available.
It does not remove credentials you independently put in an environment,
repository, or custom MCP configuration.
Operator-managed integrations are opt-in and configured by the deployment
operator, not through the curated integration connection dialogs. The same API
broker also serves Integration keys, which are individually
approved by the session owner and do not require an operator manifest.For integration keys only, leave R_HTTP_INTEGRATIONS_ENABLED unset or false and
R_HTTP_INTEGRATIONS_CONFIG_PATH unset. No per-service credential environment
variables are needed on the Roomote API: the owner saves each key in the secure
session form. Existing deployment encryption and job-signing configuration remain
required. See Integration keys self-hosting.
Create a JSON manifest on the API server and mount it read-only. Use narrow
paths and least-privilege upstream credentials.
Set R_HTTP_INTEGRATIONS_ENABLED=true on the Roomote control-plane services
that run the API, resolve task configuration, or execute sessions
(including web and background workers). Set
R_HTTP_INTEGRATIONS_CONFIG_PATH to the manifest’s absolute path on the API
server only.
Supply each referenced credential environment variable to the API process
only, using your deployment’s secret management. Do not add it to task
environment variables or sandbox images.
Restart the affected services and start a new session or refresh the task’s
integration configuration. An enabled API refuses to register the feature
if its manifest is missing or invalid.
An explicitly enabled but invalid operator configuration never falls back to
dynamic-only mode. Disable operator mode intentionally if only integration keys
are wanted.Example manifest, using a placeholder domain and Roomote user ID:
The manifest names the environment variable; it must not contain the actual
credential. prefix is optional. For an API-key header, use its header name and
omit prefix unless the upstream API requires one.
allowedUserIds restricts both discovery and calls to those Roomote user IDs.
If omitted, the integration is shared with all active human members of the
deployment. An empty list is invalid; remove the entry to disable it.
A session uses its acting user’s authentication. Sandbox requests use their
run-scoped token and the task’s current server-recorded actor, not the token’s
original user. Actorless service-principal runs and external Roomote MCP OAuth
clients cannot use this endpoint.
origin must be an HTTPS origin, without a path, query, fragment, or userinfo.
Private, loopback, metadata, and other unsafe addresses are rejected, including
unsafe DNS answers at connection time. There is no private-network exception.
Each rule pairs a method with a path prefix. /v1/items permits /v1/items
and /v1/items/123, but not /v1/items-other. A / prefix permits every path
on that origin, so avoid it unless that scope is intentional.
Available methods are GET, HEAD, POST, PUT, PATCH, and DELETE.
Mutating methods must be explicitly allowed. A method label is not proof that
an upstream operation is read-only; check the API’s semantics.
Query parameters are allowed in the request path and are not independently
restricted by the manifest. Do not expose endpoints that use a query or body
parameter to select arbitrary destinations, execute arbitrary operations, or
expand the configured authority.
Agents cannot supply arbitrary headers, override authentication, choose an
unregistered origin, or follow an upstream redirect. Redirect responses are
rejected, including same-origin redirects.
These deployment-managed credentials are separate from existing user-linked
OAuth connections. This feature does not import their tokens, refresh OAuth
tokens, or replace the inference gateway. Use an existing integration for those
connection flows.
Ask Roomote to list the available HTTP integrations. The _roomote_http_integrations
server exposes list_integrations and integration_request to both sessions and
sandbox agents. Listings contain permitted origins and rules, never credential
values or environment-variable references.If an environment or deployment already defines an MCP server named
_roomote_http_integrations, sandbox tasks preserve that server and skip the HTTP
integrations broker with a warning. Rename the operator-defined server to receive
both. Environment definitions still take precedence over deployment definitions;
Sessions are unaffected.For example, a request after listing inventory is:
For a permitted write, body is a string and contentType can be
application/json, text/plain, or application/x-www-form-urlencoded.
For GET and HEAD, omit body, pass null, or pass an empty string. These
representations are sent without a body or content-type header; nonempty bodies,
including whitespace, are rejected. contentType may also be omitted or null
and is ignored for these bodyless methods. Responses contain status, a body
string, and only the permitted response headers: content-type, retry-after,
and x-request-id. Non-redirect upstream errors can be returned as responses;
the agent should check status rather than assume a completed call succeeded.
Requests have a 30-second timeout, a 1 MiB UTF-8 request-body limit, and a 2 MiB
outer MCP request-envelope limit. Responses are buffered up to 2 MiB and must be
UTF-8 text or JSON, except for empty HEAD or 204 responses. Binary downloads,
streaming APIs, WebSockets, cookies, custom request headers, and multi-header
authentication are not supported.Concurrency is limited to four requests per run or user and 32 total per API
process. This is not a deployment-wide quota or upstream spending limit.Roomote rejects responses containing the literal credential or full injected
authorization value in their body or returned headers. This is not general
data-loss prevention: encoded, transformed, split, or unrelated secrets may
still appear in responses. Never authorize credential-echo, diagnostic,
token-management, arbitrary proxy, or similar endpoints. Use an upstream
credential whose own permissions match the intended integration scope.The manifest is loaded at API startup. Restart the API after changing rules,
access lists, or entries. Credential values are read from the API process
environment per request; updating deployment environment variables normally
requires restarting or recreating that process. Apply configuration and secret
changes to every API replica.To disable operator-managed integrations, set R_HTTP_INTEGRATIONS_ENABLED=false
on the same control-plane services and restart them. The broker remains available
for owner-approved integration keys, but no operator manifest entries are loaded.
This does not cancel an already-running operator request. Revoke personal
integration keys under Personal Settings → Personal integrations;
administrators revoke deployment-wide keys on the Integrations page.
Those changes are checked live before dispatch and before returning upstream
responses, without reloading the manifest or restarting.
Use a staging API and a narrowly scoped test credential first. Verify that an
allowed actor can list and call an approved path, a different actor cannot see
or call a restricted integration, and a disallowed method or path is refused.
Confirm that the upstream receives authentication without printing its value.If a call is rejected, check the manifest ID, current actor, method, path,
credential environment-variable presence, upstream content type, and response
size. Missing credentials, TLS or DNS failures, blocked destinations, redirects,
timeouts, and unsafe responses fail closed with a generic error. Error messages
deliberately omit credentials and outgoing query details. There is no fallback
that gives the agent credentials or bypasses request authorization.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Roomote Docs","description":"Documentation for Roomote, the open, self-hostable platform for cloud coding agents.","colors":{"primary":"#B0CD26","light":"#D6EE26","dark":"#B0CD26"},"logo":{"light":"https://docs.roomote.dev/logo/light.svg","dark":"https://docs.roomote.dev/logo/dark.svg","href":"https://docs.roomote.dev"},"favicon":"https://mintcdn.com/roocode/jcTIWgKmjs94WhSu/favicon.png?fit=max\u0026auto=format\u0026n=jcTIWgKmjs94WhSu\u0026q=85\u0026s=74880d487bd4434634770b3aadbad452","navbar":{"links":[{"icon":"external-link","href":"https://roomote.dev","label":"Go to roomote.dev"}]},"footer":{"socials":{"github":"https://github.com/RooCodeInc/Roomote"}},"fonts":{"family":"DM Sans"},"icons":{"library":"lucide"},"thumbnails":{"appearance":"light","background":"https://mintlify.s3.us-west-1.amazonaws.com/roocode/data:image/svg+xml,%3Csvg%20xmlns=%22http:/www.w3.org/2000/svg%22%20width=%221200%22%20height=%22630%22%3E%3Crect%20width=%221200%22%20height=%22630%22%20fill=%22%23D6EE26%22/%3E%3C/svg%3E","fonts":{"family":"DM Sans"}},"markdown":{"instructions":["Start new users at /index, then /self-hosting to choose and prepare a host, including home networks at /homelab or infrastructure providers at /self-hosting/platforms. Continue through /first-task. Use Local development only when the user intends to modify Roomote itself.","When an agent is asked to follow /self-hosting or install Roomote autonomously, read and follow /self-hosting/agent-installation as the normative automation contract even though it is intentionally hidden from side navigation.","Use the one-command Linux installer for both evaluation and production. On macOS or Windows, create or reuse a full Ubuntu VM and run the same installer inside it; do not replace the installer with the repository's development Compose files.","For a local VM, prepare a stable public HTTPS domain before connecting providers. Use a named tunnel with internal origin TLS or public DNS with ports 80/443 forwarded to the Linux host. Cloudflare Quick Tunnels do not support the Server-Sent Events Roomote uses; do not use them for the complete setup path.","Run automated installs with --no-setup-url so the bootstrap token is not captured in the agent transcript. Let the user obtain the setup URL in a trusted terminal, enter credentials, and complete browser authorization.","Proceed through safe, reversible setup and pause for privileged host or VM changes, public tunnel creation, credentials or browser authorization, durable external-account changes, destructive operations, existing-state conflicts, or when no documented safe default applies.","A setup is not complete when the services merely start. Follow /first-task to verify sign-in, repository sync, and a real Roomote task that can clone and run a command. A saved environment is optional for a repository task. Verify branch or pull-request delivery and previews when configured; Slack and other communications providers are optional."]},"styling":{"latex":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"roocode","hasAudioNarration":false,"actualSubdomain":"roocode","customDomains":["docs.roomote.dev"],"gitSource":{"type":"github","owner":"roocodeinc","repo":"roomote","deployBranch":"main","contentDirectory":"apps/docs","isPrivate":false,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae339e3befa89197b16780a","collectionId":"f1ef2417-180a-450f-a5fe-935a7db09091","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae339e3befa89197b16780a"},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6ae339e3befa89197b16780a","clientVersion":"0.0.4021","searchFilterCounts":[{"language":"default","tag":"Configuring Providers","count":45},{"language":"default","tag":"Integrations","count":31},{"language":"default","tag":"Models and inference","count":28},{"language":"default","tag":"Using Roomote","count":11},{"language":"default","tag":"Configuring Roomote","count":7},{"language":"default","tag":"Automating Work","count":7},{"language":"default","tag":"Sandboxes","count":7},{"language":"default","tag":"Getting started","count":5},{"language":"default","tag":"Communications","count":5},{"language":"default","tag":"Source control","count":5}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":true},"customCss":[{"filePath":"roomote.css","content":"@font-face{font-family:'Monaspace Neon';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/monaspace-neon-latin-400-normal.woff2) format('woff2')}@font-face{font-family:'Monaspace Neon';font-style:normal;font-weight:500;font-display:swap;src:url(/fonts/monaspace-neon-latin-500-normal.woff2) format('woff2')}@font-face{font-family:'Monaspace Neon';font-style:normal;font-weight:700;font-display:swap;src:url(/fonts/monaspace-neon-latin-700-normal.woff2) format('woff2')}:root{--roomote-lime:#b0cd26;--roomote-lime-light:#d6ee26;--roomote-code-font:'Monaspace Neon', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,\n 'Liberation Mono', 'Courier New', monospace;--roomote-radius:0.75rem}.font-mono,[class*=language-],code,kbd,pre,samp{font-family:var(--roomote-code-font)}.rounded-lg,.rounded-xl,img,pre{border-radius:var(--roomote-radius)}.integration-name,.navbar a[href='https://roomote.dev'],nav a[href='https://roomote.dev']{display:inline-flex;align-items:center;gap:.35rem}.navbar a[href='https://roomote.dev'] svg,nav a[href='https://roomote.dev'] svg{order:2}.integration-name{gap:.45rem;width:max-content;max-width:100%;padding:0;border:0!important;background:0 0!important;line-height:1.2;vertical-align:middle;box-shadow:none!important}.integration-logo{display:inline-block;width:1rem;height:1rem;flex:0 0 auto;margin:0!important;vertical-align:middle;border-radius:0}img[src*='/favicon.svg'],img[src*='/logo/integrations/'],img[src^='https://api.iconify.design/simple-icons/'],img[src^='https://api.iconify.design/simple-icons:'],img[src^='https://unpkg.com/@lobehub/icons-static-svg@']{border-radius:0}.integration-name [data-rmiz-content],.integration-name [data-rmiz]{display:inline-flex!important;align-items:center;flex:0 0 auto;margin:0!important}.dark img[src*='/favicon.svg'],.dark img[src*='/logo/integrations/'],.dark img[src^='https://api.iconify.design/simple-icons/'],.dark img[src^='https://api.iconify.design/simple-icons:'],.dark img[src^='https://unpkg.com/@lobehub/icons-static-svg@']{filter:invert(1)}@media (max-width:767px){[role=status][aria-live=polite][class~=z-999]{display:none}}"}],"page":{"pagePath":"integrations/http-integrations","slug":"/integrations/http-integrations","pageMetadata":{"title":"HTTP Integrations","description":"Let agents call approved HTTP APIs while Roomote keeps credentials server-side.","icon":"arrow-right-left","href":"/integrations/http-integrations"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Let agents call approved HTTP APIs while Roomote keeps credentials server-side.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`HTTP integrations let sessions and sandbox agents call an API without\nreceiving its credential. The agent chooses a configured integration, method,\npath, and request body. Roomote checks the current actor’s access, attaches the\nserver-side credential, and sends the HTTPS request.`}),`\n`,_jsx(_components.p,{children:`This works through the same Roomote API for every sandbox provider, including\nModal, Docker, E2B, Daytona, Azure, Blaxel, and Box, as well as deployment-managed sandboxes. It requires no\nprovider-specific networking configuration or proxy service. Existing connected\nintegration tools remain available and should be used first.`}),`\n`,_jsx(_components.p,{children:`For a general “connect to X” request, Roomote checks the read-only built-in\ncatalog first, including disconnected providers. It uses that provider’s native\nsetup path when present, then checks for an official remote MCP server, and uses\nHTTP integrations or an integration key only when neither applies. An MCP that\nrequires provider approval, an allowlisted client, a beta or plan, or a token\nyou hold is offered as an option rather than treated as immediately connectable.\nAn explicit request for direct API access keeps that choice. Discovery does not\nstart setup, and permission denials or pending or denied authorization are not\nbypassed.`}),`\n`,_jsx(Warning,{children:_jsx(_components.p,{children:`This is credential mediation, not network isolation. Agents are instructed to\nuse the integration tools, but normal sandbox networking remains available.\nIt does not remove credentials you independently put in an environment,\nrepository, or custom MCP configuration.`})}),`\n`,_jsx(Heading,{level:`2`,id:`configure-the-deployment`,children:`Configure the deployment`}),`\n`,_jsxs(_components.p,{children:[`Operator-managed integrations are opt-in and configured by the deployment\noperator, not through the curated integration connection dialogs. The same API\nbroker also serves `,_jsx(_components.a,{href:`/integration-keys`,children:`Integration keys`}),`, which are individually\napproved by the session owner and do not require an operator manifest.`]}),`\n`,_jsxs(_components.p,{children:[`For integration keys only, leave `,_jsx(_components.code,{children:`R_HTTP_INTEGRATIONS_ENABLED`}),` unset or `,_jsx(_components.code,{children:`false`}),` and\n`,_jsx(_components.code,{children:`R_HTTP_INTEGRATIONS_CONFIG_PATH`}),` unset. No per-service credential environment\nvariables are needed on the Roomote API: the owner saves each key in the secure\nsession form. Existing deployment encryption and job-signing configuration remain\nrequired. See `,_jsx(_components.a,{href:`/integration-keys#self-hosting`,children:`Integration keys self-hosting`}),`.`]}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsx(_components.li,{children:`Create a JSON manifest on the API server and mount it read-only. Use narrow\npaths and least-privilege upstream credentials.`}),`\n`,_jsxs(_components.li,{children:[`Set `,_jsx(_components.code,{children:`R_HTTP_INTEGRATIONS_ENABLED=true`}),` on the Roomote control-plane services\nthat run the API, resolve task configuration, or execute sessions\n(including web and background workers). Set\n`,_jsx(_components.code,{children:`R_HTTP_INTEGRATIONS_CONFIG_PATH`}),` to the manifest’s absolute path on the API\nserver only.`]}),`\n`,_jsx(_components.li,{children:`Supply each referenced credential environment variable to the API process\nonly, using your deployment’s secret management. Do not add it to task\nenvironment variables or sandbox images.`}),`\n`,_jsx(_components.li,{children:`Restart the affected services and start a new session or refresh the task’s\nintegration configuration. An enabled API refuses to register the feature\nif its manifest is missing or invalid.`}),`\n`]}),`\n`,_jsx(_components.p,{children:`An explicitly enabled but invalid operator configuration never falls back to\ndynamic-only mode. Disable operator mode intentionally if only integration keys\nare wanted.`}),`\n`,_jsx(_components.p,{children:`Example manifest, using a placeholder domain and Roomote user ID:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`16`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`16`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`[`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"id\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"inventory\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"description\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Read inventory items\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"origin\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"https://api.example.com\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"rules\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"method\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"GET\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"pathPrefix\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"/v1/items\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ],`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"credential\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"header\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Authorization\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"valueEnv\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"R_HTTP_INTEGRATION_INVENTORY_TOKEN\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"prefix\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Bearer \"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"allowedUserIds\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"replace-with-roomote-user-id\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`The manifest names the environment variable; it must not contain the actual\ncredential. `,_jsx(_components.code,{children:`prefix`}),` is optional. For an API-key header, use its header name and\nomit `,_jsx(_components.code,{children:`prefix`}),` unless the upstream API requires one.`]}),`\n`,_jsx(Heading,{level:`2`,id:`access-and-request-rules`,children:`Access and request rules`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`allowedUserIds`}),` restricts both discovery and calls to those Roomote user IDs.\nIf omitted, the integration is shared with `,_jsx(_components.strong,{children:`all active human members`}),` of the\ndeployment. An empty list is invalid; remove the entry to disable it.`]}),`\n`,_jsx(_components.li,{children:`A session uses its acting user’s authentication. Sandbox requests use their\nrun-scoped token and the task’s current server-recorded actor, not the token’s\noriginal user. Actorless service-principal runs and external Roomote MCP OAuth\nclients cannot use this endpoint.`}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`origin`}),` must be an HTTPS origin, without a path, query, fragment, or userinfo.\nPrivate, loopback, metadata, and other unsafe addresses are rejected, including\nunsafe DNS answers at connection time. There is no private-network exception.`]}),`\n`,_jsxs(_components.li,{children:[`Each rule pairs a method with a path prefix. `,_jsx(_components.code,{children:`/v1/items`}),` permits `,_jsx(_components.code,{children:`/v1/items`}),`\nand `,_jsx(_components.code,{children:`/v1/items/123`}),`, but not `,_jsx(_components.code,{children:`/v1/items-other`}),`. A `,_jsx(_components.code,{children:`/`}),` prefix permits every path\non that origin, so avoid it unless that scope is intentional.`]}),`\n`,_jsxs(_components.li,{children:[`Available methods are `,_jsx(_components.code,{children:`GET`}),`, `,_jsx(_components.code,{children:`HEAD`}),`, `,_jsx(_components.code,{children:`POST`}),`, `,_jsx(_components.code,{children:`PUT`}),`, `,_jsx(_components.code,{children:`PATCH`}),`, and `,_jsx(_components.code,{children:`DELETE`}),`.\nMutating methods must be explicitly allowed. A method label is not proof that\nan upstream operation is read-only; check the API’s semantics.`]}),`\n`,_jsx(_components.li,{children:`Query parameters are allowed in the request path and are not independently\nrestricted by the manifest. Do not expose endpoints that use a query or body\nparameter to select arbitrary destinations, execute arbitrary operations, or\nexpand the configured authority.`}),`\n`,_jsx(_components.li,{children:`Agents cannot supply arbitrary headers, override authentication, choose an\nunregistered origin, or follow an upstream redirect. Redirect responses are\nrejected, including same-origin redirects.`}),`\n`]}),`\n`,_jsx(_components.p,{children:`These deployment-managed credentials are separate from existing user-linked\nOAuth connections. This feature does not import their tokens, refresh OAuth\ntokens, or replace the inference gateway. Use an existing integration for those\nconnection flows.`}),`\n`,_jsx(Heading,{level:`2`,id:`use-an-integration`,children:`Use an integration`}),`\n`,_jsxs(_components.p,{children:[`Ask Roomote to list the available HTTP integrations. The `,_jsx(_components.code,{children:`_roomote_http_integrations`}),`\nserver exposes `,_jsx(_components.code,{children:`list_integrations`}),` and `,_jsx(_components.code,{children:`integration_request`}),` to both sessions and\nsandbox agents. Listings contain permitted origins and rules, never credential\nvalues or environment-variable references.`]}),`\n`,_jsxs(_components.p,{children:[`If an environment or deployment already defines an MCP server named\n`,_jsx(_components.code,{children:`_roomote_http_integrations`}),`, sandbox tasks preserve that server and skip the HTTP\nintegrations broker with a warning. Rename the operator-defined server to receive\nboth. Environment definitions still take precedence over deployment definitions;\nSessions are unaffected.`]}),`\n`,_jsxs(_components.p,{children:[`For example, a request after listing `,_jsx(_components.code,{children:`inventory`}),` is:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`5`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`5`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"integrationId\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"inventory\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"method\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"GET\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"path\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"/v1/items?limit=10\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`For a permitted write, `,_jsx(_components.code,{children:`body`}),` is a string and `,_jsx(_components.code,{children:`contentType`}),` can be\n`,_jsx(_components.code,{children:`application/json`}),`, `,_jsx(_components.code,{children:`text/plain`}),`, or `,_jsx(_components.code,{children:`application/x-www-form-urlencoded`}),`.\nFor `,_jsx(_components.code,{children:`GET`}),` and `,_jsx(_components.code,{children:`HEAD`}),`, omit `,_jsx(_components.code,{children:`body`}),`, pass `,_jsx(_components.code,{children:`null`}),`, or pass an empty string. These\nrepresentations are sent without a body or content-type header; nonempty bodies,\nincluding whitespace, are rejected. `,_jsx(_components.code,{children:`contentType`}),` may also be omitted or `,_jsx(_components.code,{children:`null`}),`\nand is ignored for these bodyless methods. Responses contain `,_jsx(_components.code,{children:`status`}),`, a `,_jsx(_components.code,{children:`body`}),`\nstring, and only the permitted response headers: `,_jsx(_components.code,{children:`content-type`}),`, `,_jsx(_components.code,{children:`retry-after`}),`,\nand `,_jsx(_components.code,{children:`x-request-id`}),`. Non-redirect upstream errors can be returned as responses;\nthe agent should check `,_jsx(_components.code,{children:`status`}),` rather than assume a completed call succeeded.`]}),`\n`,_jsx(Heading,{level:`2`,id:`limits-and-credential-safety`,children:`Limits and credential safety`}),`\n`,_jsxs(_components.p,{children:[`Requests have a 30-second timeout, a 1 MiB UTF-8 request-body limit, and a 2 MiB\nouter MCP request-envelope limit. Responses are buffered up to 2 MiB and must be\nUTF-8 text or JSON, except for empty `,_jsx(_components.code,{children:`HEAD`}),` or `,_jsx(_components.code,{children:`204`}),` responses. Binary downloads,\nstreaming APIs, WebSockets, cookies, custom request headers, and multi-header\nauthentication are not supported.`]}),`\n`,_jsx(_components.p,{children:`Concurrency is limited to four requests per run or user and 32 total per API\nprocess. This is not a deployment-wide quota or upstream spending limit.`}),`\n`,_jsxs(_components.p,{children:[`Roomote rejects responses containing the literal credential or full injected\nauthorization value in their body or returned headers. This is `,_jsx(_components.strong,{children:`not general\ndata-loss prevention`}),`: encoded, transformed, split, or unrelated secrets may\nstill appear in responses. Never authorize credential-echo, diagnostic,\ntoken-management, arbitrary proxy, or similar endpoints. Use an upstream\ncredential whose own permissions match the intended integration scope.`]}),`\n`,_jsx(_components.p,{children:`The manifest is loaded at API startup. Restart the API after changing rules,\naccess lists, or entries. Credential values are read from the API process\nenvironment per request; updating deployment environment variables normally\nrequires restarting or recreating that process. Apply configuration and secret\nchanges to every API replica.`}),`\n`,_jsxs(_components.p,{children:[`To disable operator-managed integrations, set `,_jsx(_components.code,{children:`R_HTTP_INTEGRATIONS_ENABLED=false`}),`\non the same control-plane services and restart them. The broker remains available\nfor owner-approved integration keys, but no operator manifest entries are loaded.\nThis does not cancel an already-running operator request. Revoke personal\nintegration keys under `,_jsx(_components.strong,{children:`Personal Settings → Personal integrations`}),`;\nadministrators revoke deployment-wide keys on the `,_jsx(_components.strong,{children:`Integrations`}),` page.\nThose changes are checked live before dispatch and before returning upstream\nresponses, without reloading the manifest or restarting.`]}),`\n`,_jsx(Heading,{level:`2`,id:`verify-and-troubleshoot`,children:`Verify and troubleshoot`}),`\n`,_jsx(_components.p,{children:`Use a staging API and a narrowly scoped test credential first. Verify that an\nallowed actor can list and call an approved path, a different actor cannot see\nor call a restricted integration, and a disallowed method or path is refused.\nConfirm that the upstream receives authentication without printing its value.`}),`\n`,_jsx(_components.p,{children:`If a call is rejected, check the manifest ID, current actor, method, path,\ncredential environment-variable presence, upstream content type, and response\nsize. Missing credentials, TLS or DNS failures, blocked destinations, redirects,\ntimeouts, and unsafe responses fail closed with a generic error. Error messages\ndeliberately omit credentials and outgoing query details. There is no fallback\nthat gives the agent credentials or bypasses request authorization.`})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"HTTP Integrations","description":"Let agents call approved HTTP APIs while Roomote keeps credentials server-side.","icon":"arrow-right-left","href":"/integrations/http-integrations"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Configure the deployment","slug":"configure-the-deployment","depth":2,"children":[]},{"title":"Access and request rules","slug":"access-and-request-rules","depth":2,"children":[]},{"title":"Use an integration","slug":"use-an-integration","depth":2,"children":[]},{"title":"Limits and credential safety","slug":"limits-and-credential-safety","depth":2,"children":[]},{"title":"Verify and troubleshoot","slug":"verify-and-troubleshoot","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"roocode","siteName":"Roomote Docs","title":"HTTP Integrations - Roomote Docs","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-29T12:20:02.704Z","originalFileLocation":"integrations/http-integrations.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=\"Let agents call approved HTTP APIs while Roomote keeps credentials server-side.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Roomote Docs\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/roocode/OL8JGyX3R70KyH08/_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/roocode/OL8JGyX3R70KyH08/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/roocode/OL8JGyX3R70KyH08/_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/roocode/OL8JGyX3R70KyH08/_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/roocode/OL8JGyX3R70KyH08/_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/roocode/OL8JGyX3R70KyH08/_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/roocode/OL8JGyX3R70KyH08/_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/roocode/OL8JGyX3R70KyH08/_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/roocode/OL8JGyX3R70KyH08/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"HTTP Integrations - Roomote Docs\">\u003cmeta data-mint-head property=\"og:description\" content=\"Let agents call approved HTTP APIs while Roomote keeps credentials server-side.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Roomote Docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.roomote.dev/integrations/http-integrations\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://roocode.mintlify.app/_mintlify/api/og/v2?division=Integrations\u0026amp;title=HTTP+Integrations\u0026amp;description=Let+agents+call+approved+HTTP+APIs+while+Roomote+keeps+credentials+server-side.\u0026amp;theme=a2d09f9240cd627ca6d77929\u0026amp;signature=6ce8681d49e9ace65f58dbdea54b423ec29b01458847f36b1fbdfff2d25d08dd\">\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=\"HTTP Integrations - Roomote Docs\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Let agents call approved HTTP APIs while Roomote keeps credentials server-side.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://roocode.mintlify.app/_mintlify/api/og/v2?division=Integrations\u0026amp;title=HTTP+Integrations\u0026amp;description=Let+agents+call+approved+HTTP+APIs+while+Roomote+keeps+credentials+server-side.\u0026amp;theme=a2d09f9240cd627ca6d77929\u0026amp;signature=6ce8681d49e9ace65f58dbdea54b423ec29b01458847f36b1fbdfff2d25d08dd\">\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/roocode/OL8JGyX3R70KyH08/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Roomote Docs\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#B0CD26\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.roomote.dev/integrations/http-integrations\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/integrations/http-integrations.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.roomote.dev/#organization\",\"name\":\"Roomote Docs\",\"url\":\"https://docs.roomote.dev\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://docs.roomote.dev/logo/light.svg\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.roomote.dev#website\",\"name\":\"Roomote Docs\",\"url\":\"https://docs.roomote.dev\",\"publisher\":{\"@id\":\"https://docs.roomote.dev/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.roomote.dev/integrations/http-integrations#webpage\",\"url\":\"https://docs.roomote.dev/integrations/http-integrations\",\"name\":\"HTTP Integrations\",\"description\":\"Let agents call approved HTTP APIs while Roomote keeps credentials server-side.\",\"dateModified\":\"2026-10-29T12:20:02.704Z\",\"isPartOf\":{\"@id\":\"https://docs.roomote.dev#website\"},\"breadcrumb\":{\"@id\":\"https://docs.roomote.dev/integrations/http-integrations#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.roomote.dev/integrations/http-integrations#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Integrations\",\"item\":\"https://docs.roomote.dev/integrations/index\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"HTTP Integrations\",\"item\":\"https://docs.roomote.dev/integrations/http-integrations\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.roomote.dev/integrations/http-integrations#article\",\"headline\":\"HTTP Integrations\",\"name\":\"HTTP Integrations\",\"description\":\"Let agents call approved HTTP APIs while Roomote keeps credentials server-side.\",\"url\":\"https://docs.roomote.dev/integrations/http-integrations\",\"mainEntityOfPage\":{\"@id\":\"https://docs.roomote.dev/integrations/http-integrations#webpage\"},\"dateModified\":\"2026-10-29T12:20:02.704Z\",\"publisher\":{\"@id\":\"https://docs.roomote.dev/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.roomote.dev#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Roomote Docs\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Roomote Docs","nav":{"global":null,"groups":[{"group":"Getting started","pages":[{"title":"Getting started","icon":"book-open","href":"/index"},{"group":"Self-hosted","icon":"server","root":{"title":"Self-hosting","icon":"server","href":"/self-hosting"},"expanded":false,"pages":[{"title":"Home network and homelab","icon":"house-plug","href":"/homelab"},{"title":"Hosting platforms","icon":"cloud-cog","href":"/self-hosting/platforms"},{"title":"Operate a self-hosted deployment","icon":"wrench","href":"/self-hosting/operations"}]},{"title":"Run your first task","icon":"play","href":"/first-task"}]},{"group":"Using Roomote","pages":[{"title":"How Roomote works","icon":"workflow","href":"/how-roomote-works"},{"title":"Use cases","icon":"bot-message-square","href":"/use-cases"},{"title":"Review a task","icon":"clipboard-check","href":"/tasks"},{"title":"Live Previews","icon":"app-window","href":"/live-previews"},{"title":"Goal Mode","icon":"target","href":"/goal-mode"},{"title":"Sessions","icon":"messages-square","href":"/fast-sessions"},{"title":"Integration keys","icon":"key-round","href":"/integration-keys"},{"title":"Memory","icon":"book-open-text","href":"/memory"},{"title":"File attachments","icon":"paperclip","href":"/file-attachments"},{"title":"Voice","icon":"audio-lines","href":"/voice"},{"title":"Privacy","icon":"shield-check","href":"/privacy"}]},{"group":"Automating Work","pages":[{"title":"Automations","icon":"zap","href":"/automations"},{"title":"Configure automations","icon":"settings-2","href":"/automation-configuration"},{"title":"Custom automations","icon":"square-pen","href":"/custom-automations"},{"title":"Automation webhooks","icon":"webhook","href":"/automation-webhooks"},{"title":"Automation results","icon":"notepad-text","href":"/automation-results"},{"title":"Cookbook","icon":"cooking-pot","href":"/cookbook/index"},{"title":"Contributing recipes","icon":"plus","href":"/cookbook/template"}]},{"group":"Configuring Providers","pages":[{"group":"Models and inference","icon":"brain","root":{"title":"Inference overview","icon":"brain","href":"/models"},"expanded":false,"pages":[{"title":"Amazon Bedrock","icon":"https://unpkg.com/@lobehub/icons-static-svg@1.94.0/icons/bedrock.svg","href":"/providers/inference/amazon-bedrock"},{"title":"Anthropic","icon":"https://unpkg.com/@lobehub/icons-static-svg@1.94.0/icons/anthropic.svg","href":"/providers/inference/anthropic"},{"title":"Azure AI Foundry","icon":"https://mintlify.s3.us-west-1.amazonaws.com/roocode/logo/integrations/azure.svg","href":"/providers/inference/azure-foundry"},{"title":"Azure OpenAI","icon":"https://mintlify.s3.us-west-1.amazonaws.com/roocode/logo/integrations/azure.svg","href":"/providers/inference/azure-openai"},{"title":"Baseten","icon":"https://unpkg.com/@lobehub/icons-static-svg@1.94.0/icons/baseten.svg","href":"/providers/inference/baseten"},{"title":"ChatGPT subscription","icon":"https://mintlify.s3.us-west-1.amazonaws.com/roocode/logo/integrations/openai.svg","href":"/providers/inference/chatgpt"},{"title":"DeepSeek","icon":"https://unpkg.com/@lobehub/icons-static-svg@1.94.0/icons/deepseek.svg","href":"/providers/inference/deepseek"},{"title":"GitHub Copilot","icon":"https://api.iconify.design/simple-icons:githubcopilot.svg?color=currentColor","href":"/providers/inference/github-copilot"},{"title":"Google Gemini","icon":"https://unpkg.com/@lobehub/icons-static-svg@1.94.0/icons/gemini.svg","href":"/providers/inference/google-gemini"},{"title":"Kimi for Coding","icon":"https://mintlify.s3.us-west-1.amazonaws.com/roocode/logo/integrations/kimi.svg","href":"/providers/inference/kimi-for-coding"},{"title":"LiteLLM","icon":"https://unpkg.com/@lobehub/icons-static-svg@1.94.0/icons/openai.svg","href":"/providers/inference/litellm"},{"title":"MiniMax","icon":"https://unpkg.com/@lobehub/icons-static-svg@1.94.0/icons/minimax.svg","href":"/providers/inference/minimax"},{"title":"Moonshot AI (Kimi)","icon":"https://mintlify.s3.us-west-1.amazonaws.com/roocode/logo/integrations/moonshot.svg","href":"/providers/inference/moonshot-ai"},{"title":"Ollama","icon":"https://unpkg.com/@lobehub/icons-static-svg@1.94.0/icons/ollama.svg","href":"/providers/inference/ollama"},{"title":"OpenAI","icon":"https://mintlify.s3.us-west-1.amazonaws.com/roocode/logo/integrations/openai.svg","href":"/providers/inference/openai"},{"title":"OpenAI-compatible","icon":"https://unpkg.com/@lobehub/icons-static-svg@1.94.0/icons/openai.svg","href":"/providers/inference/openai-compatible"},{"title":"OpenCode Zen","icon":"https://api.iconify.design/simple-icons/opencode.svg?color=currentColor","href":"/providers/inference/opencode"},{"title":"OpenCode Go","icon":"https://api.iconify.design/simple-icons/opencode.svg?color=currentColor","href":"/providers/inference/opencode-go"},{"title":"OpenRouter","icon":"https://mintlify.s3.us-west-1.amazonaws.com/roocode/logo/integrations/openrouter.svg","href":"/providers/inference/openrouter"},{"title":"Requesty","icon":"https://mintlify.s3.us-west-1.amazonaws.com/roocode/logo/integrations/requesty.png","href":"/providers/inference/requesty"},{"title":"Together AI","icon":"https://unpkg.com/@lobehub/icons-static-svg@1.94.0/icons/together.svg","href":"/providers/inference/together-ai"},{"title":"TypeSafe","icon":"https://mintlify.s3.us-west-1.amazonaws.com/roocode/logo/integrations/typesafe.svg","href":"/providers/inference/typesafe"},{"title":"Vercel AI Gateway","icon":"https://api.iconify.design/simple-icons/vercel.svg?color=currentColor","href":"/providers/inference/vercel-ai-gateway"},{"title":"vLLM","icon":"https://unpkg.com/@lobehub/icons-static-svg@1.94.0/icons/vllm.svg","href":"/providers/inference/vllm"},{"title":"xAI","icon":"https://unpkg.com/@lobehub/icons-static-svg@1.94.0/icons/xai.svg","href":"/providers/inference/xai"},{"title":"xAI Grok subscription","icon":"https://unpkg.com/@lobehub/icons-static-svg@1.94.0/icons/xai.svg","href":"/providers/inference/xai-subscription"},{"title":"Z.AI","icon":"https://unpkg.com/@lobehub/icons-static-svg@1.94.0/icons/zai.svg","href":"/providers/inference/zai"},{"title":"Z.AI Coding Plan","icon":"https://unpkg.com/@lobehub/icons-static-svg@1.94.0/icons/zai.svg","href":"/providers/inference/zai-coding-plan"}]},{"group":"Communications","icon":"messages-square","root":{"title":"Communications overview","icon":"messages-square","href":"/communications"},"expanded":false,"pages":[{"title":"Email (AgentMail)","icon":"https://mintlify.s3.us-west-1.amazonaws.com/roocode/logo/integrations/agentmail.svg","href":"/providers/communications/agentmail"},{"title":"Discord","icon":"https://api.iconify.design/simple-icons:discord.svg?color=currentColor","href":"/providers/communications/discord"},{"title":"Microsoft Teams","icon":"https://api.iconify.design/simple-icons:microsoftteams.svg?color=currentColor","href":"/providers/communications/microsoft-teams"},{"title":"Slack","icon":"https://api.iconify.design/simple-icons:slack.svg?color=currentColor","href":"/providers/communications/slack"},{"title":"Telegram","icon":"https://api.iconify.design/simple-icons:telegram.svg?color=currentColor","href":"/providers/communications/telegram"}]},{"group":"Source control","icon":"git-merge","root":{"title":"Source control overview","icon":"git-merge","href":"/source-control"},"expanded":false,"pages":[{"title":"Azure DevOps","icon":"https://api.iconify.design/simple-icons:azuredevops.svg?color=currentColor","href":"/providers/source-control/azure-devops"},{"title":"Bitbucket Cloud","icon":"https://api.iconify.design/simple-icons:bitbucket.svg?color=currentColor","href":"/providers/source-control/bitbucket"},{"title":"Gitea","icon":"https://api.iconify.design/simple-icons:gitea.svg?color=currentColor","href":"/providers/source-control/gitea"},{"title":"GitHub","icon":"https://api.iconify.design/simple-icons:github.svg?color=currentColor","href":"/providers/source-control/github"},{"title":"GitLab","icon":"https://api.iconify.design/simple-icons:gitlab.svg?color=currentColor","href":"/providers/source-control/gitlab"}]},{"group":"Sandboxes","icon":"cpu","root":{"title":"Sandboxes overview","icon":"cpu","href":"/compute"},"expanded":false,"pages":[{"title":"Azure Container Apps","icon":"https://mintlify.s3.us-west-1.amazonaws.com/roocode/logo/integrations/azure.svg","href":"/providers/compute/azure"},{"title":"Blaxel","icon":"https://mintlify.s3.us-west-1.amazonaws.com/roocode/logo/integrations/blaxel.svg","href":"/providers/compute/blaxel"},{"title":"Box","icon":"https://mintlify.s3.us-west-1.amazonaws.com/roocode/logo/integrations/box.svg","href":"/providers/compute/box"},{"title":"Daytona","icon":"https://mintlify.s3.us-west-1.amazonaws.com/roocode/logo/integrations/daytona.svg","href":"/providers/compute/daytona"},{"title":"Docker","icon":"https://api.iconify.design/simple-icons:docker.svg?color=currentColor","href":"/providers/compute/docker"},{"title":"E2B","icon":"https://mintlify.s3.us-west-1.amazonaws.com/roocode/logo/integrations/e2b.svg","href":"/providers/compute/e2b"},{"title":"Modal","icon":"https://api.iconify.design/simple-icons:modal.svg?color=currentColor","href":"/providers/compute/modal"}]}]},{"group":"Integrations","pages":[{"title":"Integrations overview","icon":"plug","href":"/integrations/index"},{"title":"Custom MCP servers","icon":"plug-zap","description":"Connect MCP servers that are not in the built-in catalog","href":"/integrations/custom-mcp-servers"},{"title":"HTTP Integrations","icon":"arrow-right-left","href":"/integrations/http-integrations"},{"title":"Roomote MCP","icon":"https://mintlify.s3.us-west-1.amazonaws.com/roocode/favicon.svg","description":"Start, inspect, and continue Roomote sessions and tasks from your MCP client.","href":"/integrations/roomote-mcp"},{"title":"Asana","icon":"https://api.iconify.design/simple-icons:asana.svg?color=currentColor","href":"/integrations/asana"},{"title":"Better Stack","icon":"https://api.iconify.design/simple-icons:betterstack.svg?color=currentColor","href":"/integrations/better-stack"},{"title":"Buildkite","icon":"https://api.iconify.design/simple-icons:buildkite.svg?color=currentColor","href":"/integrations/buildkite"},{"title":"Braintrust","icon":"https://api.iconify.design/simple-icons:braintrust.svg?color=currentColor","href":"/integrations/braintrust"},{"title":"Cloudflare","icon":"https://api.iconify.design/simple-icons:cloudflare.svg?color=currentColor","href":"/integrations/cloudflare"},{"title":"ElevenLabs","icon":"https://api.iconify.design/simple-icons:elevenlabs.svg?color=currentColor","href":"/integrations/elevenlabs"},{"title":"Exa","icon":"https://mintlify.s3.us-west-1.amazonaws.com/roocode/logo/integrations/exa.svg","href":"/integrations/exa"},{"title":"Grafana","icon":"https://api.iconify.design/simple-icons:grafana.svg?color=currentColor","href":"/integrations/grafana"},{"title":"Granola","icon":"https://mintlify.s3.us-west-1.amazonaws.com/roocode/logo/integrations/granola.svg","href":"/integrations/granola"},{"title":"Jira","icon":"https://api.iconify.design/simple-icons:jira.svg?color=currentColor","href":"/integrations/jira"},{"title":"Linear","icon":"https://api.iconify.design/simple-icons:linear.svg?color=currentColor","href":"/integrations/linear"},{"title":"monday.com","icon":"https://mintlify.s3.us-west-1.amazonaws.com/roocode/logo/integrations/monday.svg","href":"/integrations/monday"},{"title":"Neon","icon":"https://api.iconify.design/simple-icons:neon.svg?color=currentColor","href":"/integrations/neon"},{"title":"Notion","icon":"https://api.iconify.design/simple-icons:notion.svg?color=currentColor","href":"/integrations/notion"},{"title":"PostHog","icon":"https://api.iconify.design/simple-icons:posthog.svg?color=currentColor","href":"/integrations/posthog"},{"title":"Pylon","icon":"https://mintlify.s3.us-west-1.amazonaws.com/roocode/logo/integrations/pylon.svg","href":"/integrations/pylon"},{"title":"Railway","icon":"https://api.iconify.design/simple-icons:railway.svg?color=currentColor","href":"/integrations/railway"},{"title":"Resend","icon":"https://api.iconify.design/simple-icons:resend.svg?color=currentColor","href":"/integrations/resend"},{"title":"Rippling","icon":"users","href":"/integrations/rippling"},{"title":"Sentry","icon":"https://api.iconify.design/simple-icons:sentry.svg?color=currentColor","href":"/integrations/sentry"},{"title":"Snowflake","icon":"https://api.iconify.design/simple-icons:snowflake.svg?color=currentColor","href":"/integrations/snowflake"},{"title":"Supabase","icon":"https://api.iconify.design/simple-icons:supabase.svg?color=currentColor","href":"/integrations/supabase"},{"title":"Supermemory","icon":"https://mintlify.s3.us-west-1.amazonaws.com/roocode/logo/integrations/supermemory.svg","href":"/integrations/supermemory"},{"title":"Vercel","icon":"https://api.iconify.design/simple-icons:vercel.svg?color=currentColor","href":"/integrations/vercel"},{"title":"Voice","icon":"https://mintlify.s3.us-west-1.amazonaws.com/roocode/logo/integrations/voice.svg","href":"/integrations/voice"},{"title":"X","icon":"https://api.iconify.design/simple-icons:x.svg?color=currentColor","href":"/integrations/x"},{"title":"Zero","icon":"https://mintlify.s3.us-west-1.amazonaws.com/roocode/logo/integrations/zero.svg","href":"/integrations/zero"}]},{"group":"Configuring Roomote","pages":[{"title":"Agent guidance","icon":"scroll-text","href":"/agent-guidance"},{"title":"Environment variables","icon":"variable","href":"/environment-variables"},{"title":"Environments","icon":"boxes","href":"/environments"},{"title":"Environment definition","icon":"file-code","href":"/environments/definition"},{"title":"Personal settings","icon":"user-cog","href":"/personal-settings"},{"title":"Skills","icon":"sparkles","href":"/skills"},{"title":"Users","icon":"users","href":"/users"}]},{"group":"Analytics","pages":[{"title":"Cost analytics","icon":"circle-dollar-sign","href":"/cost-analytics"}]},{"group":"Development","pages":[{"title":"Local development","icon":"terminal","href":"/local-development"},{"title":"How a Roomote deployment runs","icon":"network","href":"/architecture"}]}]},"title":"HTTP Integrations - Roomote Docs","buildId":"dpl_EnxDqhjaNc9a8MVa833TGULPd9uJ","deploymentId":"dpl_EnxDqhjaNc9a8MVa833TGULPd9uJ","dynamics":[],"chunks":[]}