Connect

The connect section of a marketplace manifest JSON corresponds to the values on the Connect page in the app build flow.

It defines how your Zoom app authenticates with third-party applications, integrates external data, exposes REST APIs, registers incoming webhooks, and optionally provides an MCP server.

This document describes every field available in the connect section, including its data type, whether it is required, and any constraints enforced when the manifest is imported.

Note - Every field in the tables below is marked Required, Optional, or Conditional. Conditional means the field is required only in specific cases; the cases are stated in the field's own description.


Overview

A connector lets a third-party API be used as a set of building blocks inside the Zoom platform — for example, as actions and triggers in workflows, or as tools an agent can call. The connect object is where you declare that integration.

At a high level, the connect object answers four questions:

  • How does the connector authenticate to your API? → the security block.
  • What APIs can the connector call? → the routes array, where each route is one REST API on your service.
  • Does your service need to send events to the connector? → the incoming_webhooks array.
  • Does the connector need to call an MCP server? → the mcp block.

Manifest JSON

This is a display of the full connect schema populated with sample values.

You only include the sections your connector actually uses. A connector can be as small as a base URL plus authentication, or as rich as dozens of routes, webhooks, and an MCP server. Everything in the JSON is validated at import time; if any section is malformed, the import is rejected and you'll receive a validation error describing the problem.

{
    "connect": {
        "enable": true,
        "url": "https://api.example.com",
        "security": {
            "type": 36,
            "oauth_config": {
                "authorize_url": "https://app.example.com/oauth/authorize",
                "access_token_url": "https://app.example.com/oauth/token",
                "refresh_url": "https://app.example.com/oauth/token",
                "client_id": "abc123",
                "client_secret": "s3cr3t",
                "scope": "read write",
                "client_authentication": "header",
                "code_challenge_method": "S256"
            }
        },
        "routes": [
            {
                "name": "Get the current user",
                "path": "/users/me",
                "method": "GET",
                "key": "example_get_current_user",
                "description": "Returns the authenticated user.",
                "parameters": [
                    {
                        "name": "include",
                        "displayName": "Include",
                        "description": "Related resources to include.",
                        "in": "query",
                        "required": false,
                        "schema": { "type": "string" }
                    }
                ],
                "response": {
                    "description": "Current user",
                    "content": "application/json"
                }
            },
            {
                "name": "Create item",
                "path": "/items",
                "method": "POST",
                "key": "example_create_item",
                "request_body": {
                    "required": true,
                    "content": "application/json",
                    "schema": {
                        "type": "object",
                        "properties": [
                            {
                                "key": "title",
                                "name": "title",
                                "type": "string"
                            },
                            {
                                "key": "count",
                                "name": "count",
                                "type": "integer"
                            }
                        ]
                    }
                },
                "response": {
                    "description": "Created",
                    "content": "application/json"
                }
            }
        ],
        "incoming_webhooks": [
            {
                "name": "Item events",
                "short_description": "Fires on item changes.",
                "key": "example_item_events",
                "type": "RestHook",
                "status": "READY",
                "state": "ON",
                "authentication": {
                    "key": "X-Signature",
                    "secret": "whsec_xxx",
                    "algorithm": "HMAC_SHA256",
                    "encoding": "BASE64",
                    "prefix": "sha256="
                },
                "validation": {
                    "enabled": true,
                    "request_key": "challenge",
                    "response_key": "challenge"
                },
                "rest_hook": {
                    "subscribe": { "route_key": "example_create_item" },
                    "unsubscribe": { "route_key": "example_create_item" }
                }
            }
        ],
        "mcp": {
            "base_url": "https://mcp.example.com/sse",
            "name": "Example",
            "ext": {
                "description": "Example MCP server"
            }
        }
    }
}

Connect

The connect object sits inside the marketplace manifest and carries the following top-level fields.

JSON fieldTypeRequiredDescription
enablebooleanOptionalMaster switch for the connect capability. When omitted, the platform infers whether connect is active from the other fields.
urlstringOptionalBase URL of your connector's REST API. Each route's path is appended to this value to form the full request URL.
securityobjectConditionalAuthentication configuration that tells the platform how to sign requests to your API. Required whenever your API needs credentials — that is, for every authentication type except No Auth.
routesarrayOptionalDefinitions of the REST APIs your connector exposes; each entry is one call against the base url. Maximum 100 routes.
incoming_webhooksarrayOptionalDefinitions of the webhooks your service uses to push events to the platform.
mcpobjectOptionalConfiguration for a Model Context Protocol server exposed by your connector.

Enabling connect

Whether the connect capability is active depends on enable and on whether you've actually provided any connect data. In practice, the minimum you need is to set enable: true and provide at least a url.

If you want to ship a manifest with the connector temporarily turned off, set enable: false — your other connect fields are preserved in the manifest but not activated.

The manifest tool will also consider connect as disabled and all connect data is ignored if enable is omitted and the connect object is effectively empty — that is, url is blank, security is null, routes is empty, and incoming_webhooks is empty.


Security

The security block tells the platform how to authenticate every request the connector makes to your API. You pick one authentication type, then supply the matching credential and endpoint fields inside oauth_config.

JSON fieldTypeRequiredDescription
typeintegerRequiredThe authentication method, given as a numeric code (for example, 1 for API Key or 31 for OAuth2 Authorization Code). See type values for the full list of supported values.
oauth_configobjectConditionalHolds the credential and endpoint fields for the selected type. Required for every type that needs credentials (all types except No Auth). Despite its name, this object is used for all authentication types, not only OAuth. See oauth config fields.

Validation notes

  • If connect is enabled and the security block is malformed for the chosen type, the import is rejected with an authentication validation error.
  • MCP overrides security.

When an mcp block is present, the MCP configuration takes precedence over the security block — regardless of whether an authentication type is set — and authentication is handled as part of the MCP configuration instead.

Type values

Each authentication type has a stable numeric code. The codes are not sequential; gaps are intentional (some values are reserved and are not part of the manifest import path). Use only the values listed here.

typeNameFields used in oauth_config
1API Keykey, api_key_type
5Basic AuthThe username and password are provided by the end user when they connect, not configured in the manifest.
6Bearer TokenThe token is provided by the end user when they connect, not configured in the manifest.
7JWT Beareralgorithm, add_to, secret
8No Auth— (no credentials)
9AWS SigV4aws_* fields. See field details.
31OAuth2 Authorization Codeauthorize_url, access_token_url, client_id, client_secret, scope, client_authentication, refresh_url, advanced_config
33OAuth2 Passwordaccess_token_url, client_id, client_secret, username, password, scope, client_authentication, refresh_url, advanced_config
34OAuth2 Client Credentialsaccess_token_url, client_id, client_secret, scope, client_authentication, refresh_url, advanced_config, jwt_client_assertion
36OAuth2 Authorization Code + PKCESame as 31, plus code_challenge_method

Notes for OAuth types

  • Redirect URL is server-assigned. For Authorization Code (31) and Authorization Code + PKCE (36), the OAuth redirect URL is assigned by the platform when your manifest is imported. Do not set it in the manifest; register the assigned value with your identity provider after import.
  • Token request delivery. On import, the OAuth token request is always sent with parameters in the request body. Any request_type value you supply is informational only and does not change this behavior.
  • Client Credentials — (client_id / client_secret are optional) For OAuth2 Client Credentials (34), you may set client_id and client_secret in the manifest. If you do, they apply to every customer using the app. If you leave them out, each end user is prompted to provide their own when they install and connect the app.

oauth_config fields

These are the credential and endpoint fields referenced by the security type. Include only the fields that apply to your chosen type.

JSON fieldTypeApplies toDescription
keystringAPI KeyName of the header or query parameter that carries the API key.
api_key_typestringAPI KeyWhere the key is sent — header or query.
tokenstringBearer TokenThe bearer token value (write-only).
usernamestringBasic Auth, OAuth2 PasswordUsername credential.
passwordstringBasic Auth, OAuth2 PasswordPassword credential (write-only).
algorithmstringJWT BearerSigning algorithm for the JWT, e.g. HS256.
add_tostringJWT BearerWhere the signed JWT is placed on the request, e.g. header.
secretstringJWT BearerSigning secret used to produce the JWT (write-only).
client_idstringOAuth2OAuth client ID.
client_secretstringOAuth2OAuth client secret (write-only).
authorize_urlstringOAuth2 Code / Code + PKCEAuthorization endpoint the user is redirected to.
access_token_urlstringOAuth2Token endpoint used to exchange for an access token.
refresh_urlstringOAuth2Token refresh endpoint.
scopestringOAuth2Space-separated list of scopes to request.
client_authenticationstringOAuth2How client credentials are sent to the token endpoint: header (HTTP Basic) or body.
code_challenge_methodstringOAuth2 Code + PKCEPKCE challenge method: S256 (recommended) or plain.
request_typestringOAuth2Informational only; the platform always sends token-request parameters in the body.

Write-only fields

Write-only fields (token, password, secret, client_secret) are accepted on import but are never returned when a manifest is exported. Treat them as sensitive: supply them once, and expect them to be redacted in any read-back of the manifest.

AWS SigV4 fields

Use these fields when authenticating to an AWS-hosted API with Signature Version 4. The role and region can be provided here as defaults and overridden per connection when a user sets up the connector.

JSON fieldTypeDescription
aws_is_headerbooleantrue places the signature in the request header (default); false places it in a query parameter.
aws_iam_rolestringIAM role ARN used for the STS AssumeRole call. Can be set per connection; use the manifest to provide a default.
aws_regionstringAWS region. Can be set per connection; use the manifest to provide a default.

Routes

Each entry in routes defines one REST API the connector can call — a single request against your connector's base url. Routes are what become usable inside the Zoom platform (for example, as steps in a workflow or as tools an agent can invoke). Define one route per meaningful operation your API exposes.

Note

  • You can set up to a maximum of 100 routes.
  • Every non-blank key must be unique across the array. The key is the identifier used to reference the route elsewhere (including from incoming webhooks); it is important to keep it stable across manifest versions.
JSON fieldTypeRequiredDescription
namestringRequiredHuman-readable name for this API, shown to users.
pathstringRequiredPath appended to the connector's base url, e.g. /users/me.
methodstringRequiredHTTP method — one of GET, POST, PUT, PATCH, DELETE, OPTIONS, HEAD, TRACE.
keystringRequiredStable, unique identifier for this route.
descriptionstringOptionalLonger description of what this API does.
parametersarrayOptionalThe route's inputs — path segments, query arguments, or headers. See parameters for the shape of each entry.
request_bodyobjectOptionalA structured definition of the request payload for methods that send a body. See Request_body for details.
responseobjectOptionalA definition of the response your API returns, used to map its output into downstream steps. See response for details.

Parameters that reference another route's output (cross-route dependencies) are validated after all routes have been parsed, so the referenced route can appear anywhere in the array.

Parameters

A parameter describes a single input to the route — a path segment, a query argument, or a header. Define one entry per input your API accepts so the platform can prompt for and pass the right values.

To describe the request body, use the request_body object, not a parameter.

JSON fieldTypeRequiredDescription
namestringRequiredParameter name as sent to your API. Maximum 50 characters. Must not be blank.
displayNamestringOptionalFriendly label shown to users. Maximum 50 characters. Defaults to name when omitted.
descriptionstringOptionalExplanation of the parameter. Maximum 250 characters.
instringRequiredWhere the parameter is sent: path, query, or header. Defaults to header on import if omitted.
requiredbooleanOptionalWhether the parameter must be provided by the caller.
schemaobjectRequiredData type and shape of the value. See 4.4 for the schema structure.
activebooleanOptionalWhether the parameter is active. Defaults to true.
explodebooleanOptionalControls how arrays and objects are serialized (OpenAPI-style explode). Defaults to false.
disableUrlEncodebooleanOptionalIf true, the value is not URL-encoded. Defaults to false.
allowEmptyValuebooleanOptionalIf true, an empty value is allowed. Defaults to false.

Request_body

Describes the payload sent with the route, for methods such as POST, PUT, and PATCH. The request body is defined here as a single structured schema — it is not described through the parameters array.

JSON fieldTypeRequiredDescription
descriptionstringOptionalExplanation of the body. Maximum 250 characters.
requiredbooleanOptionalWhether the body must be provided.
contentstringOptionalContent type, e.g. application/json. Maximum 100 characters.
schemaobjectOptionalShape of the body. See schema for the schema structure.
standardSchemaobjectOptionalA normalized version of the schema, used when the body maps to a standard object shape.
jsonstringOptionalExample body as a JSON string.
testJsonstringOptionalSample body used for test calls. When present, it is parsed and validated as a data schema.

Response

Describes the response your API returns for the route. Defining a response schema lets the platform map your API's output into downstream steps.

JSON fieldTypeRequiredDescription
descriptionstringOptionalExplanation of the response. Maximum 250 characters.
contentstringOptionalContent type, e.g. application/json. Maximum 100 characters.
schemaobjectOptionalShape of the response body. See schema for the schema structure.
standardSchemaobjectOptionalA normalized version of the schema.
headersarrayOptionalResponse headers, each described with the same fields as a parameter.
jsonstringOptionalExample response as a JSON string.

Schema

A recursive, JSON-Schema-like structure used to describe the shape of parameters, request bodies, and responses. Nest it to represent arrays and objects of any depth.

JSON fieldTypeDescription
keystringStable identifier for the field.
namestringField name.
displayNamestringFriendly label for the field.
typestringData type: string, integer, number, boolean, array, or object.
valueanyDefault or current value.
testValueanyValue used for test calls.
itemsobjectSchema for each element, used when type is array.
propertiesarrayChild schema entries, used when type is object.
dependencyobjectDescribes a dependency on another parameter's value.
enumarrayThe set of allowed values for the field.

Setting up recursion:

For an array, describe the element type in items.

For an object, list its fields in properties, where each entry is itself a schema and can contain further items or properties.

Primitive types (string, integer, number, boolean) are leaf nodes.


Incoming webhooks

An incoming webhook lets your service push events to the Zoom platform rather than being polled. Each entry defines one webhook the connector registers.

There are two kinds of webhooks:

  • RestHook — the platform subscribes and unsubscribes by calling routes you've defined (for example, "create subscription" / "delete subscription" endpoints on your API). Use this when your service supports dynamic subscription management.
  • Static — a fixed webhook with no subscribe/unsubscribe lifecycle. Use this when events are delivered to a fixed endpoint.

Limits and uniqueness

  • The number of incoming webhooks an app can define is capped by a per-app maximum (default 100).
  • Every non-blank key must be unique.
JSON fieldTypeRequiredEnum / ValuesDescription
namestringRequiredWebhook name. Must not be blank.
short_descriptionstringOptionalShort description of the webhook.
keystringRequiredStable, unique identifier for the webhook.
typestringRequiredRestHook, StaticWebhook kind. If unknown or absent, defaults to RestHook.
statusstringRequiredINCOMPLETE, READYReadiness status. Any other value (or absent) is rejected.
statestringRequiredON, OFFOperational state (case-insensitive). Any other value is rejected.
authenticationobjectRequiredSignature verification configuration; must not be null. See 5.1 for its fields.
validationobjectOptionalHandshake validation configuration for the initial endpoint challenge. See 5.2 for its fields.
rest_hookobjectConditionalSubscribe/unsubscribe route bindings. Required when type is RestHook; must be absent when type is Static. See rest_hook for field information.

Signing secret

A webhook typically reaches status: READY only once its signing secret is set. (See secret in authentication). Until then it may remain INCOMPLETE.

Authentication

Configures how the platform verifies that an incoming request genuinely came from your service, by checking a signature you attach to each delivery.

JSON fieldTypeRequiredEnum / ValuesDescription
keystringRequiredName of the header or field that carries the signature. Must not be blank.
secretstringOptionalSigning secret used to verify the signature (write-only — omitted on export). Required for the webhook to reach READY.
algorithmstringOptionalN/A, EQUAL, NOT_BLANK, HMAC_SHA256Signature algorithm. Validated only when non-blank; an unlisted value is rejected.
encodingstringOptionalN/A, BASE64Signature encoding. Validated only when non-blank; an unlisted value is rejected.
prefixstringOptionalOptional prefix on the signature value, e.g. sha256=.

Validation

Configures the initial handshake some services perform to confirm a webhook endpoint before sending events (an echo/challenge exchange).

JSON fieldTypeRequiredDescription
enabledbooleanOptionalEnables handshake validation. If this is false or absent but request_key/response_key are set, the configuration is rejected.
request_keystringOptionalField read from the incoming validation request.
response_keystringOptionalField echoed back in the response.

Rest_hook

rest_hook binds the webhook's subscribe and unsubscribe steps to routes you've defined and applies to RestHook webhooks only.

JSON fieldTypeRequiredDescription
subscribe.route_keystringRequired (for RestHook)key of the route called to create the subscription. Must reference an existing route defined in section 4.
unsubscribe.route_keystringRequired (for RestHook)key of the route called to remove the subscription. Must reference an existing route defined in section 4.

MCP

If your connector exposes a Model Context Protocol server, declare it here. This lets the connector surface your MCP tools on the platform.

JSON fieldTypeRequiredDescription
base_urlstringRequiredMCP server base URL. Must be a valid HTTPS URL that passes domain validation. Leading and trailing whitespace is trimmed automatically.
namestringOptionalDisplay name for the MCP server.
extobjectRequiredContainer for extended MCP configuration; include it in your manifest. None of the fields available to you are individually required. See the note in EXT for why the object itself is still required.

EXT

JSON fieldTypeRequiredDescription
descriptionstringOptionalDescription of the MCP server.

Why ext is required but none of its listed fields are:

The complete manifest defines additional ext fields that are required internally but are managed by the platform and are not exposed to external developers. Because of those internal fields, the ext object itself must be present — but none of the externally-available fields listed above are required. Set description only if you need it.

Implementation rules:

  • How the OAuth client ID is obtained

    For an MCP connector, Zoom obtains the OAuth client ID programmatically — it registers with your authorization server automatically, using either Dynamic Client Registration (DCR) or a Client ID Metadata Document (CIMD). The Zoom MCP client supports both. Because registration is handled programmatically, do not set a static client_id in security.oauth_config; if you supply one, it is rejected on import.

  • If base_url fails validation, or the server is unsupported, or another server-side error occurs, the import is rejected with a corresponding validation error.


Constraints & limits

AreaConstraint
Routes≤ 100 entries; each non-blank key must be unique; method must be one of the allowed HTTP methods.
Parameter name / displayName≤ 50 characters.
description (parameters / body / response)≤ 250 characters.
content (body / response)≤ 100 characters.
Parameter inDefaults to header on import if omitted.
SecurityA malformed security block is rejected (unless an mcp block is present, which overrides security); OAuth token requests are always sent in the body; the redirect URL is server-assigned for Authorization Code and Authorization Code + PKCE.
Incoming webhooks≤ per-app maximum (default 100); each non-blank key must be unique; authentication and its key are required; status ∈ {INCOMPLETE, READY}; state ∈ {ON, OFF}; type ∈ {RestHook, Static}; algorithm ∈ {N/A, EQUAL, NOT_BLANK, HMAC_SHA256}; encoding ∈ {N/A, BASE64}; each rest_hook route key must reference an existing route; the signing secret is write-only.
MCPbase_url must be a valid HTTPS URL; the ext object must be present (though none of its externally-available fields are required); the OAuth client ID is obtained programmatically via DCR or CIMD, so a static client_id must not be set (it is rejected on import).