Connections
Your own systems (a calendar, a CRM, a shop, an MCP server) that the avatar uses through actions.
/v1/connectionsList your connected systems
Every connection of the organisation with its status and health (the share of calls answered, the median time, the last problem in plain words). Never a key: only a masked hint.
Returns
200 The connections, and whether the switch is on. data is ConnectionList.
Fields of data
onbooleanrequiredThe organisation's actions.connectors switch: off, nothing connected is used and nothing new can be connected.
Errors
invalid_requestunauthorizedforbiddenupgrade_requiredrate_limitedserver_error
Request
curl "https://app.zentiqai.com/v1/connections" \
-H "Authorization: Bearer $ZENTIQ_API_KEY"import { Zentiq } from "@zentiq/node";
const zentiq = new Zentiq({ apiKey: process.env.ZENTIQ_API_KEY });
const result = await zentiq.listConnections();import os
from zentiq import Zentiq
zentiq = Zentiq(api_key=os.environ["ZENTIQ_API_KEY"])
result = zentiq.list_connections()Example answer
{
"data": {
"on": true,
"connections": [
{
"id": "conn_123",
"kind": "mcp",
"name": "Zoe",
"label": "…",
"status": "pending",
"statusWords": "…"
}
]
},
"error": null,
"requestId": "req_4f1c2e9a7b3d5e6f7a8b9c0d"
}/v1/connectionsConnect one of your systems
Connects a system the avatar will use through actions: a remote MCP server (no sign-in, a bearer token, or OAuth), Cal.com (an API key), HubSpot (a private app's token), Shopify (the shop and an Admin API token), a calendar (google_calendar, microsoft_calendar: a sign-in, once Zentiq's app is set up for them). A key is checked with a read-only call before it is saved, then sealed and never returned: only a masked hint. An MCP server's tools are read first. A sign-in answers with authorizeUrl, where an owner approves it while signed in to the console; until then the connection is pending. The address of an MCP server must be public https on the standard port. Off (403) while the organisation's actions.connectors switch is off. Connecting your own systems is on Plus and up: on a plan without it, 403 upgrade_required with details.reason plan_required and details.plan.
Body
kind"mcp" | "calcom" | "hubspot" | "shopify" | "google_calendar" | "microsoft_calendar" | "slack" | "zapier"requiredWhich system.
labelstring | nullA plain name (never a key).
at most 60 characters
urlstring | nullmcp: the server's public https MCP address (standard port; private and local addresses are refused).
auth"none" | "bearer" | "oauth" | nullmcp: how it signs in.
oauth: the answer'sauthorizeUrlis where an owner approves it, signed in to the console.tokenstring | nullmcp (bearer), hubspot (a private app's access token) or shopify (an older app's Admin API access token, made in the Shopify admin before 2026). Write-only: checked, sealed in the vault and never returned (only a masked hint).
apiKeystring | nullcalcom: a Cal.com API key. Write-only: checked, sealed in the vault and never returned (only a masked hint).
eventTypeIdstring | number | nullcalcom: the event type's number.
timeZonestring | nullcalcom, google_calendar, microsoft_calendar: an IANA time zone, like America/New_York.
shopstring | nullshopify: the shop's address, like your-shop.myshopify.com.
clientIdstring | nullshopify: a Dev Dashboard app's Client ID (the app's Settings), with clientSecret instead of token. Zentiq asks Shopify for the app's 24-hour tokens itself (the client credentials grant: the store must be in the app's own Shopify organisation).
at most 100 characters
clientSecretstring | nullshopify: a Dev Dashboard app's Client secret, with clientId. It also verifies the order notifications Shopify sends for order emails. Write-only: checked, sealed in the vault and never returned (only a masked hint).
apiSecretstring | nullshopify with token: the older app's API secret key, which only order emails need (Shopify signs its order notifications with it). Write-only: checked, sealed in the vault and never returned (only a masked hint).
propertiesstring | string[] | nullhubspot: the contact properties the avatar may read (HubSpot's own names).
calendarIdstring | nullgoogle_calendar: which calendar ("primary" unless named).
hoursmap of string | nullgoogle_calendar, microsoft_calendar: opening hours per day, like { "mon": "09:00-17:00" } (a day left out is closed).
slotMinutesnumber | nulllengthMinutesnumber | nulltitlestring | nullgoogle_calendar, microsoft_calendar: a booking's title.
at most 60 characters
Returns
201 Connected (or waiting for its sign-in). data is ConnectionCreated.
Fields of data
One of the organisation's connected systems. Never a key or a token.
authorizeUrlstring | nullrequiredFor a sign-in: where an owner approves it, signed in to the console. null when it is connected already.
Errors
invalid_requestunauthorizedforbiddenupgrade_requiredconflictrate_limitedserver_error
Request
curl -X POST "https://app.zentiqai.com/v1/connections" \
-H "Authorization: Bearer $ZENTIQ_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"kind": "mcp"
}'import { Zentiq } from "@zentiq/node";
const zentiq = new Zentiq({ apiKey: process.env.ZENTIQ_API_KEY });
const result = await zentiq.createConnection({
kind: "mcp",
});import os
from zentiq import Zentiq
zentiq = Zentiq(api_key=os.environ["ZENTIQ_API_KEY"])
result = zentiq.create_connection({
"kind": "mcp",
})Example answer
{
"data": {
"connection": {
"id": "conn_123",
"kind": "mcp",
"name": "Zoe",
"label": "…",
"status": "pending",
"statusWords": "…"
},
"authorizeUrl": "https://www.example.com"
},
"error": null,
"requestId": "req_4f1c2e9a7b3d5e6f7a8b9c0d"
}/v1/connections/{id}Disconnect a system
Deletes the connection and its key. Every action that used it is switched off (actionsOff says how many). Works while the switch is off, on any plan.
Path parameters
idstringrequiredConnection id (
conn_…).
Returns
200 Disconnected. data is ConnectionDeleted.
Fields of data
idstringrequiredactionsOffintegerrequiredActions that used it, now switched off.
Errors
invalid_requestunauthorizedforbiddenupgrade_requirednot_foundrate_limitedserver_error
Request
curl -X DELETE "https://app.zentiqai.com/v1/connections/conn_123" \
-H "Authorization: Bearer $ZENTIQ_API_KEY"import { Zentiq } from "@zentiq/node";
const zentiq = new Zentiq({ apiKey: process.env.ZENTIQ_API_KEY });
const result = await zentiq.deleteConnection("conn_123");import os
from zentiq import Zentiq
zentiq = Zentiq(api_key=os.environ["ZENTIQ_API_KEY"])
result = zentiq.delete_connection("conn_123")Example answer
{
"data": {
"id": "…",
"actionsOff": 1
},
"error": null,
"requestId": "req_4f1c2e9a7b3d5e6f7a8b9c0d"
}/v1/connections/{id}/testTest a connection
A read-only call that proves the connection still works (an MCP server's tools are read again), counted on its health. It never changes anything. On a plan without connecting your own systems (Plus and up): 403 upgrade_required with details.reason plan_required.
Path parameters
idstringrequiredConnection id (
conn_…).
Returns
200 How it went. data is ConnectionTest.
Fields of data
okbooleanrequiredwordsstringrequiredOne of the organisation's connected systems. Never a key or a token.
Errors
invalid_requestunauthorizedforbiddenupgrade_requirednot_foundconflictrate_limitedserver_error
Request
curl -X POST "https://app.zentiqai.com/v1/connections/conn_123/test" \
-H "Authorization: Bearer $ZENTIQ_API_KEY"import { Zentiq } from "@zentiq/node";
const zentiq = new Zentiq({ apiKey: process.env.ZENTIQ_API_KEY });
const result = await zentiq.testConnection("conn_123");import os
from zentiq import Zentiq
zentiq = Zentiq(api_key=os.environ["ZENTIQ_API_KEY"])
result = zentiq.test_connection("conn_123")Example answer
{
"data": {
"ok": true,
"words": "…",
"connection": {
"id": "conn_123",
"kind": "mcp",
"name": "Zoe",
"label": "…",
"status": "pending",
"statusWords": "…"
}
},
"error": null,
"requestId": "req_4f1c2e9a7b3d5e6f7a8b9c0d"
}