Skip to the documentation
API

Connectors

Every operation in this group: what it accepts, what it returns and the errors it can answer with.

Operations

Outside apps, such as Slack, Notion or Google Drive, that a person connects so the assistant can look things up in them and act there. A connector belongs to one person (account) or to the workspace (workspace).

GET/connector-apps

List apps that can be connected

Scopesconnectors:readReads

The catalogue of apps that can be connected, most used first, as the Browse tab of the Connectors page shows it. Narrow it with search or category.

Requires the connectors:read scope.

Query parameters

searchstring

Words to look for in the name or the description.

categorystring

A category slug from the catalogue, to list only the apps in it.

limitinteger

Rows per page, 1 to 60.

At least 1At most 60Default24
cursorstring

The previous page's nextCursor, passed back as it came. It is opaque: it holds where the last row sat in this list's order, so a row deleted or edited between pages never breaks the walk, and the next page starts at the first row that sorts after it. A value this list did not hand out is a 400 invalid_cursor.

Returns

A page of apps.

Errors

503

connectors_unavailable: connectors are not switched on. connector_provider_failed: the connection service did not answer.

The errors every operation can return400401403404422500Error catalog

Also available in

TypeScript
connectors.listApps()connectors.listAllApps()connectors.iterateApps()
Python
connectors.list_apps()connectors.list_all_apps()connectors.iterate_apps()
Ruby
connectors.list_appsconnectors.list_all_appsconnectors.iterate_apps
PHP
connectors->listAppsconnectors->listAllAppsconnectors->iterateApps
Go
Connectors.ListAppsConnectors.ListAllAppsConnectors.IterateApps
Java
connectors().listAppsconnectors().listAllAppsconnectors().iterateApps
C#
Connectors.ListAppsAsyncConnectors.ListAllAppsAsyncConnectors.IterateAppsAsync
CLI
openemail connectors list-apps
MCP
listConnectorApps

GET/connector-apps/{slug}

Read an app of the catalogue

Scopesconnectors:readReads

One app of the catalogue by its slug.

Requires the connectors:read scope.

Path parameters

slugstringRequired

The slug of the app, such as slack.

Returns

The app.

Errors

The errors every operation can return400401403404422500Error catalog

Also available in

TypeScript
connectors.getApp()
Python
connectors.get_app()
Ruby
connectors.get_app
PHP
connectors->getApp
Go
Connectors.GetApp
Java
connectors().getApp
C#
Connectors.GetAppAsync
CLI
openemail connectors get-app
MCP
getConnectorApp

GET/connector-categories

List app categories

Scopesconnectors:readReads

The categories the catalogue sorts its apps into. Pass a slug from here as category when listing apps.

Requires the connectors:read scope.

Returns

The categories.

Errors

The errors every operation can return400401403404422500Error catalog

Also available in

TypeScript
connectors.listCategories()
Python
connectors.list_categories()
Ruby
connectors.list_categories
PHP
connectors->listCategories
Go
Connectors.ListCategories
Java
connectors().listCategories
C#
Connectors.ListCategoriesAsync
CLI
openemail connectors list-categories
MCP
listConnectorApps

GET/connectors

List connectors

Scopesconnectors:readReads

The connectors the caller can reach: the ones shared with the workspace, and its own. A connector that belongs to one person is reached only by an app that person connected, which also has to hold account:read, or account:write to change it. An API key acts for the workspace and reaches the shared connectors only. A key or an app limited to particular addresses or domains does not reach the shared ones.

Requires the connectors:read scope.

Query parameters

scopestring

account lists only the connectors that belong to the person the caller acts for, workspace only the shared ones.

One of"account""workspace"
statusstring

Only the connectors in this state.

One of"pending""active""expired""paused"
appstring

Only the connectors of this app, by its slug.

Returns

The connectors, by app.

Errors

The errors every operation can return400401403404422500Error catalog

Also available in

TypeScript
connectors.list()
Python
connectors.list()
Ruby
connectors.list
PHP
connectors->list
Go
Connectors.List
Java
connectors().list
C#
Connectors.ListAsync
CLI
openemail connectors list
MCP
listConnectors

POST/connectors

Connect an app

Scopesconnectors:writeChanges data

Starts connecting an app and returns the connector with a connectUrl. A person has to open that link and sign in to the app there, or enter its key, on a page outside this API, so the secret never passes through the caller. Read the connector again afterwards: it is active once they have finished. With no scope the connector is shared with the workspace. A connector that belongs to one person is reached only by an app that person connected, which also has to hold account:read, or account:write to change it. An API key acts for the workspace and reaches the shared connectors only. A key or an app limited to particular addresses or domains does not reach the shared ones. A plan holds 2, 10 or 50 connectors for an account and as many again for a workspace. The largest plan sets no limit of its own, and nothing holds more than 200.

Requires the connectors:write scope.

Request body

appstringRequired

The app to connect, by the slug the catalogue lists it under, such as slack or notion.

1 to 80 charactersPattern^[a-z0-9][a-z0-9_-]*$
scopestring

Who the connector is for. account keeps it to one person. workspace shares it with the workspace, where tasks and anyone allowed to use connectors can reach it. Left out, it is workspace.

One of"account""workspace"
labelstring

A name of your own for the connector, such as Sales Slack. Up to 80 characters.

Up to 80 characters
accessstring

What the assistant may do through it. read lets it look things up. full also lets it make changes, which it asks a person about first in chat and in tasks. Left out, it is full.

One of"read""full"

Returns

The connector, still pending, with its link.

Errors

403

insufficient_scope: the key or app may not connect an app for that scope. connector_limit_reached: the plan holds no more connectors.

404

connector_app_not_found: the catalogue has no app with that slug.

422

invalid_parameter: a field is missing or malformed. connector_app_unavailable: the app cannot be connected yet.

The errors every operation can return400401500Error catalog

Also available in

TypeScript
connectors.connect()
Python
connectors.connect()
Ruby
connectors.connect
PHP
connectors->connect
Go
Connectors.Connect
Java
connectors().connect
C#
Connectors.ConnectAsync
CLI
openemail connectors connect
MCP
connectApp

GET/connectors/{id}

Read a connector

Scopesconnectors:readReads

One connector by its id, read fresh. While it is pending this also checks whether the sign-in was finished, so it is the call to make after sending somebody to connectUrl.

Requires the connectors:read scope.

Path parameters

idstringRequired

The connector, such as cnr_5c1e9a7b3d2f48e6a0b4c7d1, as GET /connectors lists it.

Returns

The connector.

Errors

The errors every operation can return400401403404422500Error catalog

Also available in

TypeScript
connectors.get()
Python
connectors.get()
Ruby
connectors.get
PHP
connectors->get
Go
Connectors.Get
Java
connectors().get
C#
Connectors.GetAsync
CLI
openemail connectors get
MCP
getConnector

PATCH/connectors/{id}

Update a connector

Scopesconnectors:writeChanges data

Renames a connector, pauses or resumes it, or changes its access. Send only what changes. A paused connector refuses every action until it is resumed.

Requires the connectors:write scope.

Path parameters

idstringRequired

The connector, such as cnr_5c1e9a7b3d2f48e6a0b4c7d1, as GET /connectors lists it.

Request body

labelstring

A name of your own for the connector, such as Sales Slack. Up to 80 characters.

Can be nullUp to 80 characters
accessstring

What the assistant may do through it. read lets it look things up. full also lets it make changes, which it asks a person about first in chat and in tasks. Left out, it is full.

One of"read""full"
pausedboolean

true stops every use of the connector until it is resumed. false resumes it.

Returns

The connector after the change.

Errors

403

insufficient_scope: the key or app may not change this connector. connector_limit_reached: resuming it would go over what the plan holds.

409

connector_not_active: only an active connector can be paused.

422

invalid_parameter: nothing to change was sent, or a field is malformed.

The errors every operation can return400401404500Error catalog

Also available in

TypeScript
connectors.update()
Python
connectors.update()
Ruby
connectors.update
PHP
connectors->update
Go
Connectors.Update
Java
connectors().update
C#
Connectors.UpdateAsync
CLI
openemail connectors update
MCP
updateConnector

DELETE/connectors/{id}

Disconnect an app

Scopesconnectors:writeDeletes

Disconnects the app for good. The access it held in the outside app is given up there too, and its record of calls goes with it. A task that named the connector can no longer reach the app.

Requires the connectors:write scope.

Path parameters

idstringRequired

The connector, such as cnr_5c1e9a7b3d2f48e6a0b4c7d1, as GET /connectors lists it.

Returns

Disconnected.

Errors

The errors every operation can return400401403404422500Error catalog

Also available in

TypeScript
connectors.disconnect()
Python
connectors.disconnect()
Ruby
connectors.disconnect
PHP
connectors->disconnect
Go
Connectors.Disconnect
Java
connectors().disconnect
C#
Connectors.DisconnectAsync
CLI
openemail connectors disconnect
MCP
disconnectConnector

POST/connectors/{id}/reconnect

Reconnect a connector

Scopesconnectors:writeChanges data

Returns a fresh connectUrl for a connector that is expired, or whose first link ran out. A person has to open that link and sign in to the app there, or enter its key, on a page outside this API, so the secret never passes through the caller. Read the connector again afterwards: it is active once they have finished. The connector keeps its id, label and access.

Requires the connectors:write scope.

Path parameters

idstringRequired

The connector, such as cnr_5c1e9a7b3d2f48e6a0b4c7d1, as GET /connectors lists it.

Returns

The connector with a fresh link.

Errors

422

connector_app_unavailable: the app can no longer be connected.

The errors every operation can return400401403404500Error catalog

Also available in

TypeScript
connectors.reconnect()
Python
connectors.reconnect()
Ruby
connectors.reconnect
PHP
connectors->reconnect
Go
Connectors.Reconnect
Java
connectors().reconnect
C#
Connectors.ReconnectAsync
CLI
openemail connectors reconnect
MCP
reconnectConnector

GET/connectors/{id}/actions

List what a connector can do

Scopesconnectors:useReads

The actions of the app behind a connector that match search, or its most used ones when search is left out. A connector set to read lists only the actions that read.

Requires the connectors:use scope.

Path parameters

idstringRequired

The connector, such as cnr_5c1e9a7b3d2f48e6a0b4c7d1, as GET /connectors lists it.

Query parameters

searchstring

Words to look for in the name or the description.

limitinteger

How many actions to return.

At least 1At most 30Default12

Returns

The matching actions.

Errors

409

connector_not_active: the connector is paused, pending or expired.

503

connector_provider_failed: the connection service did not answer.

The errors every operation can return400401403404422500Error catalog

Also available in

TypeScript
connectors.listActions()
Python
connectors.list_actions()
Ruby
connectors.list_actions
PHP
connectors->listActions
Go
Connectors.ListActions
Java
connectors().listActions
C#
Connectors.ListActionsAsync
CLI
openemail connectors list-actions
MCP
searchConnectorActions

GET/connectors/{id}/actions/{action}

Read an action

Scopesconnectors:useReads

One action with the input it takes, as a JSON Schema. Build the input of a run from it.

Requires the connectors:use scope.

Path parameters

idstringRequired

The connector, such as cnr_5c1e9a7b3d2f48e6a0b4c7d1, as GET /connectors lists it.

actionstringRequired

The action, such as SLACK_SEND_MESSAGE, as the actions list of the connector names it.

Returns

The action with its input schema.

Errors

409

connector_not_active: the connector is paused, pending or expired.

503

connector_provider_failed: the connection service did not answer.

The errors every operation can return400401403404422500Error catalog

Also available in

TypeScript
connectors.getAction()
Python
connectors.get_action()
Ruby
connectors.get_action
PHP
connectors->getAction
Go
Connectors.GetAction
Java
connectors().getAction
C#
Connectors.GetActionAsync
CLI
openemail connectors get-action
MCP
getConnectorAction

POST/connectors/{id}/actions/{action}/run

Run an action

Scopesconnectors:useSends mail

Runs one action in the connected app and returns what the app answered. An action that reads runs at once, and so does one that changes something: over the API nobody is asked first, so the caller decides. Inside the app the assistant asks a person before every change. A change made in the outside app cannot be taken back from here, and the call is not repeated when it fails. Every run is listed under GET /connector-calls, without its input or its result.

Requires the connectors:use scope.

Path parameters

idstringRequired

The connector, such as cnr_5c1e9a7b3d2f48e6a0b4c7d1, as GET /connectors lists it.

actionstringRequired

The action, such as SLACK_SEND_MESSAGE, as the actions list of the connector names it.

Request body

inputRecord<string, any>

The input of the action as an object, shaped as the input schema of that action describes.

Returns

The outcome. ok is false when the app itself refused the action.

Errors

403

connector_read_only: the connector is set to read and the action changes something.

409

connector_not_active: the connector is paused, pending or expired.

422

invalid_parameter: input is not an object or is too large. connector_action_failed: the app refused the request as it was sent.

503

connector_provider_failed: the connection service did not answer.

The errors every operation can return400401404500Error catalog

Also available in

TypeScript
connectors.runAction()
Python
connectors.run_action()
Ruby
connectors.run_action
PHP
connectors->runAction
Go
Connectors.RunAction
Java
connectors().runAction
C#
Connectors.RunActionAsync
CLI
openemail connectors run-action

GET/connector-calls

List what was done through connectors

Scopesconnectors:readReads

Every action that ran through a connector the caller can reach, newest first: the app, the action, whether it read or changed something, whether it worked, and whether it came from chat, a task, the API or an agent. Inputs and results are never kept. Calls are kept 90 days.

Requires the connectors:read scope.

Query parameters

connectorIdstring

Only the calls made through this connector.

scopestring

account lists only the connectors that belong to the person the caller acts for, workspace only the shared ones.

One of"account""workspace"
limitinteger

Rows per page, 1 to 100.

At least 1At most 100Default25
cursorstring

The previous page's nextCursor, passed back as it came. It is opaque: it holds where the last row sat in this list's order, so a row deleted or edited between pages never breaks the walk, and the next page starts at the first row that sorts after it. A value this list did not hand out is a 400 invalid_cursor.

Returns

A page of calls.

Errors

The errors every operation can return400401403404422500Error catalog

Also available in

TypeScript
connectors.listCalls()connectors.listAllCalls()connectors.iterateCalls()
Python
connectors.list_calls()connectors.list_all_calls()connectors.iterate_calls()
Ruby
connectors.list_callsconnectors.list_all_callsconnectors.iterate_calls
PHP
connectors->listCallsconnectors->listAllCallsconnectors->iterateCalls
Go
Connectors.ListCallsConnectors.ListAllCallsConnectors.IterateCalls
Java
connectors().listCallsconnectors().listAllCallsconnectors().iterateCalls
C#
Connectors.ListCallsAsyncConnectors.ListAllCallsAsyncConnectors.IterateCallsAsync
CLI
openemail connectors list-calls
MCP
listConnectorCalls

Objects

Connectorobject

objectstringRequired
One of"connector"
idstringRequired

The id, which starts with cnr_.

scopestringRequired

account when it belongs to one person, workspace when it is shared with the workspace.

One of"account""workspace"
appstringRequired

The slug of the connected app, such as slack.

appNamestringRequired

The name of the app, such as Slack.

appLogostringRequired

A link to the logo of the app.

Can be null
labelstringRequired

The name the person gave the connector, if any.

Can be nullUp to 80 characters
statusstringRequired

pending until the sign-in behind connectUrl is finished, active while it works, paused while a person or the plan holds it back, and expired when the app stopped accepting the connection and it has to be reconnected.

One of"pending""active""expired""paused"
failurestringRequired

Why an expired connector stopped working: expired when the sign-in ran out, revoked when the access was taken away in the app, failed when the app refused the connection, disabled when the connection was switched off.

Can be nullOne of"expired""revoked""failed""disabled"
pausedReasonstringRequired

user when a person paused it, plan when the workspace moved to a plan that holds fewer connectors.

Can be nullOne of"user""plan"
accessstringRequired

read when the assistant may only look things up through it, full when it may also make changes.

One of"read""full"
connectedAtstringRequired

When the sign-in was last finished.

Can be nullFormatdate-time
lastUsedAtstringRequired

When an action last ran through it.

Can be nullFormatdate-time
createdAtstringRequired

When the connector was created.

Formatdate-time
updatedAtstringRequired

When it last changed.

Formatdate-time

ConnectorActionobject

objectstringRequired
One of"connector_action"
actionstringRequired

The name to run the action by.

namestringRequired

What the action is called.

descriptionstringRequired

What it does.

kindstringRequired

read when it only looks something up, change when it creates, updates, sends or deletes something, or when the app does not say.

One of"read""change"

ConnectorActionDetailobject

objectstringRequired
One of"connector_action"
actionstringRequired

The name to run the action by.

namestringRequired

What the action is called.

descriptionstringRequired

What it does.

kindstringRequired

read when it only looks something up, change when it creates, updates, sends or deletes something, or when the app does not say.

One of"read""change"
inputobjectRequired

The input the action takes, as a JSON Schema.

ConnectorAppobject

objectstringRequired
One of"connector_app"
slugstringRequired

The slug to connect the app by.

namestringRequired

What the app is called.

descriptionstringRequired

What the app is, in a sentence or two.

logostringRequired

A link to its logo.

Can be null
websitestringRequired

The site of the app.

Can be null
categoriesConnectorCategory[]Required
actionsintegerRequired

How many actions the app offers.

authstringRequired

sign-in when the person signs in to the app, key when they paste a key from it, and null when it cannot be connected yet.

Can be nullOne of"sign-in""key"
connectablebooleanRequired

Whether it can be connected today.

ConnectorAppListobject

objectstring
One of"list"
hasMoreboolean

True when another page follows. Pass nextCursor back as cursor to read it.

nextCursorstring

An opaque cursor for the next page, or null on the last page. Pass it back unchanged.

Can be null

ConnectorCallobject

objectstringRequired
One of"connector_call"
idstringRequired

The id, which starts with cnc_.

connectorIdstringRequired

The connector the call went through.

appstringRequired

The slug of the app.

appNamestringRequired

The name of the app.

actionstringRequired

The action that was run.

kindstringRequired

Whether the action reads or changes something.

One of"read""change"
statusstringRequired

ok when it ran, failed when the app or the connection refused it, refused when a rule here stopped it before it reached the app.

One of"ok""failed""refused"
errorCodestringRequired

The error code of a call that did not run, such as connector_action_failed.

Can be null
sourcestringRequired

Where the call came from: chat for the assistant in the app, task for a task running by itself, api for this API and mcp for an agent on the MCP server.

One of"chat""task""api""mcp"
durationMsintegerRequired

How long the call took, in milliseconds.

atstringRequired

When it ran.

Formatdate-time

ConnectorCallListobject

objectstring
One of"list"
hasMoreboolean

True when another page follows. Pass nextCursor back as cursor to read it.

nextCursorstring

An opaque cursor for the next page, or null on the last page. Pass it back unchanged.

Can be null

ConnectorCategoryobject

slugstringRequired

The value to pass as category.

namestringRequired

What the category is called.

ConnectorListobject

objectstring
One of"list"

ConnectorRunobject

objectstringRequired
One of"connector_run"
connectorIdstringRequired

The connector the action ran through.

appstringRequired

The slug of the app.

actionstringRequired

The action that ran.

kindstringRequired

Whether the action reads or changes something.

One of"read""change"
okbooleanRequired

Whether the app carried the action out.

dataanyRequired

What the app answered, in its own shape. When truncated is true it is the start of that answer as text.

errorstringRequired

What the app said when ok is false.

Can be null
truncatedbooleanRequired

Whether the answer was too long to return whole.

DeletedConnectorobject

objectstringRequired
One of"connector"
idstringRequired

The id of the connector that was disconnected.

scopestringRequired

Whether it belonged to one person or to the workspace.

One of"account""workspace"
appstringRequired

The slug of the app it connected.

deletedbooleanRequired
One oftrue