# What changed in @composio/core

> 30 changes in @composio/core 0.25 to 0.27 from its official release notes, upgrade guides and advisories: 12 breaking, 1 deprecations, 8 new APIs and options. Each one cited. Sources checked 2026-10-28. HTML: https://unstale.sh/npm/@composio/core/

To see which of these apply to a repository, run `npx @unstale/cli init` in it.

## @composio/core 0.27

### Breaking changes

- session.proxyExecute() and ctx.proxyExecute() return resultType: 'completed' or resultType: 'blocked'. Blocked requests have no HTTP response, so check resultType before reading status. (0.27.0) — [release notes](https://github.com/ComposioHQ/composio/releases/tag/%40composio/core%400.27.0)

### New APIs and options

- create() and update() accept session hooks that can block a tool call before it runs or block its result before the agent sees it. On update, hooks replaces the list; null removes all hooks. hooks cannot be combined with experimental.sessionConfigId. (0.27.0) — [release notes](https://github.com/ComposioHQ/composio/releases/tag/%40composio/core%400.27.0)

### Behavior and default changes

- Blocked calls from session.execute() and session.executeMeta() return resultType: 'blocked', empty data, the hook's message in error, and blockReason. Every result also carries hookResults when a hook applied. (0.27.0) — [release notes](https://github.com/ComposioHQ/composio/releases/tag/%40composio/core%400.27.0)

## @composio/core 0.26

### Breaking changes

- The SDK passes credentials through the API client's auth option and organization/project scope through scope, rather than placing them in default headers. (0.26.0) — [release notes](https://github.com/ComposioHQ/composio/releases/tag/%40composio/core%400.26.0)
- The SDK no longer applies this environment variable; pass defaultHeaders instead. (0.26.0) — [release notes](https://github.com/ComposioHQ/composio/releases/tag/%40composio/core%400.26.0)
- For S2S_OAUTH2, customConnectionData now requires val.access_token, matching the API requirement. (0.26.0) — [release notes](https://github.com/ComposioHQ/composio/releases/tag/%40composio/core%400.26.0)
- The returned client no longer exposes apiKey, userApiKey, orgApiKey, or logger; baseURL, maxRetries, timeout, and logLevel are read-only. Read keys from getConfig and derive clients with withOptions to change the other settings. (0.26.0) — [release notes](https://github.com/ComposioHQ/composio/releases/tag/%40composio/core%400.26.0)
- A per-call headers option can no longer specify credential or scope headers. (0.26.0) — [release notes](https://github.com/ComposioHQ/composio/releases/tag/%40composio/core%400.26.0)
- String formats outside the listed OpenAI-supported set are removed from strict tool schemas and reported as unsupported-keyword-stripped. (0.26.0) — [release notes](https://github.com/ComposioHQ/composio/releases/tag/%40composio/core%400.26.0)
- OpenAPI nullable is converted into a null type or null branch instead of being passed through; nullable: false is stripped and the rewrite is reported. (0.26.0) — [release notes](https://github.com/ComposioHQ/composio/releases/tag/%40composio/core%400.26.0)
- Setting more than one of x-api-key, x-user-api-key, and x-org-api-key now throws ComposioError because the API rejected every such request. (0.26.0) — [release notes](https://github.com/ComposioHQ/composio/releases/tag/%40composio/core%400.26.0)

### Deprecations

- The SDK warns once per toolkit version when the API marks it deprecated, including the version, sunset date, and how to pin a newer version; error log level silences the warning. (0.26.0) — [release notes](https://github.com/ComposioHQ/composio/releases/tag/%40composio/core%400.26.0)

### Behavior and default changes

- Credential and scope headers are folded into SDK options rather than forwarded; getConfig reports the folded values and omits those headers from defaultHeaders. (0.26.0) — [release notes](https://github.com/ComposioHQ/composio/releases/tag/%40composio/core%400.26.0)
- When apiKey is null and only an organization API key is supplied, every request, trigger channel authorization, and session.mcp.headers now carry x-org-api-key. (0.26.0) — [release notes](https://github.com/ComposioHQ/composio/releases/tag/%40composio/core%400.26.0)

### Fixes and other changes

- String tool parameters are checked as base64 only when contentEncoding is base64; binary and other encodings are plain strings, while byte remains unchecked. (0.26.0) — [release notes](https://github.com/ComposioHQ/composio/releases/tag/%40composio/core%400.26.0)
- Null values are retained for properties marked nullable: true, as they already are when the type includes null. (0.26.0) — [release notes](https://github.com/ComposioHQ/composio/releases/tag/%40composio/core%400.26.0)

## @composio/core 0.25

### Breaking changes

- Setting API-client-owned identity and runtime headers through defaultHeaders or createSession({ headers }) now throws a ComposioError instead of silently overwriting them. (0.25.0) — [release notes](https://github.com/ComposioHQ/composio/releases/tag/%40composio/core%400.25.0)
- executeMeta() takes approval answers as its third argument, moving request options to the fourth. (0.25.0) — [release notes](https://github.com/ComposioHQ/composio/releases/tag/%40composio/core%400.25.0)
- unsubscribe() closes the realtime connection so a Node process can exit; calling it before subscribe() no longer fetches credentials or creates a client. (0.25.0) — [release notes](https://github.com/ComposioHQ/composio/releases/tag/%40composio/core%400.25.0)

### New APIs and options

- Matching tool calls do not run and execute() or executeMeta() throws this error with questions on inputRequests; answers and requestState can be supplied when repeating the call. (0.25.0) — [release notes](https://github.com/ComposioHQ/composio/releases/tag/%40composio/core%400.25.0)
- The Python SDK gains the deny-or-allow fallback setting for sessions whose MCP client cannot ask the user. (0.25.0) — [release notes](https://github.com/ComposioHQ/composio/releases/tag/%40composio/core%400.25.0)
- Sets whether a call is denied or allowed when the session's MCP client cannot ask the user for approval. (0.25.0) — [release notes](https://github.com/ComposioHQ/composio/releases/tag/%40composio/core%400.25.0)
- The Python SDK adds input_responses and request_state to session.execute() and session.execute_meta() for answering approval requests. (0.25.0) — [release notes](https://github.com/ComposioHQ/composio/releases/tag/%40composio/core%400.25.0)
- Repeat a tool call with the user's answers in inputResponses and the error's requestState; forward decline and cancel responses unchanged. (0.25.0) — [release notes](https://github.com/ComposioHQ/composio/releases/tag/%40composio/core%400.25.0)
- The Python SDK gains require_approval lists for session tool approval. (0.25.0) — [release notes](https://github.com/ComposioHQ/composio/releases/tag/%40composio/core%400.25.0)
- Sessions accept a requireApproval list alongside toolkits, tools, and tags filters on create() and update(); matching tool calls require user approval before they run. (0.25.0) — [release notes](https://github.com/ComposioHQ/composio/releases/tag/%40composio/core%400.25.0)

### Behavior and default changes

- The SDK reports itself through the API client's identity option instead of default headers. On Cloudflare Workers and Vercel Edge with Node.js compatibility enabled, x-client-runtime names that runtime and x-runtime-version is no longer sent. (0.25.0) — [release notes](https://github.com/ComposioHQ/composio/releases/tag/%40composio/core%400.25.0)
- A custom provider name that is not printable ASCII or has leading or trailing whitespace is reported as unknown in x-framework. (0.25.0) — [release notes](https://github.com/ComposioHQ/composio/releases/tag/%40composio/core%400.25.0)

### Fixes and other changes

- Rejected promises from async trigger handlers are logged like synchronous throws instead of escaping as unhandled rejections; handler failures log the error message. (0.25.0) — [release notes](https://github.com/ComposioHQ/composio/releases/tag/%40composio/core%400.25.0)
- Concurrent subscribe() calls share one connection, and unsubscribe() cancels a subscription that is still connecting so it never opens a connection or delivers events afterwards. (0.25.0) — [release notes](https://github.com/ComposioHQ/composio/releases/tag/%40composio/core%400.25.0)
