> Portal Navigation:
> 
> - Append `.md` to any URL under `https://dev.wix.com/docs/` to get its markdown version.
> - Pages are either content pages (article or reference text) or menu pages (a list of links to child pages).
> - To get a menu page, truncate any URL to a parent path and append `.md` (e.g. `https://dev.wix.com/docs/sdk.md`, `https://dev.wix.com/docs/sdk/core-modules.md`).
> - If a reference page seems to be missing its schema (parameters, return types, or type definitions), append `?schema=true` to its `.md` URL (e.g. `https://dev.wix.com/docs/contexts/contexts/stores/category-info/use-category-info-context.md?schema=true`).
> - Top-level index of all portals: https://dev.wix.com/docs/llms.txt
> - Full concatenated docs: https://dev.wix.com/docs/llms-full.txt

## Resource: Introduction

## Article: Introduction

## Article Link: https://dev.wix.com/docs/api-reference/business-management/calendar/conferencing/conferencing-provider-v1/introduction.md

## Article Content:

# About the Conferencing Provider Service Plugin

The Conferencing Provider service plugin lets you integrate a video conferencing provider, such as Zoom or Google Meet, with Wix conferencing. You implement the plugin, and Wix calls it to connect a resource to your provider and to create and manage conferences on its behalf. A resource is identified by an opaque ID that you key connections by. It's the ID of a [Bookings resource](https://dev.wix.com/docs/api-reference/business-solutions/bookings/resources/resources-v2.md), such as the resource of a staff member or the site's default business resource.

Your implementation owns connection state: you store connections and any access tokens, and Wix reads the current state from you on demand. Wix doesn't store connections or conferences itself.

With the Conferencing Provider service plugin, you can:

- Connect a resource to your provider using OAuth or credentials.
- Create, update, retrieve, and delete conferences in your provider for a connected resource.
- Report a resource's connections and their status back to Wix.
- Disconnect a resource from your provider.

## How this service plugin works

Wix calls your implementation when a user connects or disconnects a conferencing account for a resource, and when a conference needs to be created, updated, retrieved, or deleted for a connected resource. Calls are synchronous, and Wix waits for your response before continuing. The connect methods Wix calls depend on the connection methods you advertise in your configuration, and Wix calls Update Conference only when your configuration sets `updateSupported = true`.

Wix passes the conference details you return, such as the join URL and password, to the Wix product that requested the conference, through the [Conferencing API](https://dev.wix.com/docs/api-reference/business-management/calendar/conferencing/conference-v1/introduction.md). Wix reads your connections through List Connections to show connection status. If your implementation returns an error, Wix surfaces it to the caller. The exception is List Connections: if it fails, Wix leaves your connections out of the results and still returns the connections of other providers.

### Context provided with each call

Wix automatically includes context information with every service plugin call. Use this context to tailor your implementation's behavior to the site, user, and scenario.

| Context | Description |
|---------|-------------|
| Site identifiers | Unique identifiers for the Wix site and instance making the request. |
| Locale/Language | The language and regional settings of the current user session. |
| Currency | The currency configured for the site. |
| Identity | The type and ID of the entity making the request (site member, visitor, or app). |

::::TABS

:::REST_TAB

## Get started

To enable Wix to communicate with your app:

1. Go to [Extensions](https://dev.wix.com/docs/build-apps/develop-your-app/extensions/about-extensions.md) in your app's dashboard.
1. Click **Create Extension** in the top right.
1. Find **Conferencing Provider** and click **Create**.
1. Provide the following configuration in the JSON editor and then click **Save**.

    | Name | Type | Description |
    | --- | --- | --- |
    | `deploymentUri` | string | **Required.** Base URI where your implementation is deployed. Wix appends each method path to this base URI. For example, to call Create Conference at `https://my-conferencing.com/v1/create-conference`, the base URI is `https://my-conferencing.com/`. |
    | `displayName` | string | Name shown to users. For example, `Zoom`. |
    | `connectionMethods` | array | Connection methods your provider supports: `OAUTH`, `CREDENTIALS`, or both. Wix calls only the connect methods matching these values. |
    | `updateSupported` | boolean | Whether your provider supports updating conferences. When `false`, Wix doesn't call Update Conference. |
    | `termsUrl`, `privacyUrl`, `iconUrl`, `supportUrl` | string | Terms of service, privacy policy, icon, and support URLs shown to users. |

:::
:::SDK_TAB

## Get started

**Self-hosted implementations:**

To enable Wix to communicate with your app:

1. Go to [Extensions](https://dev.wix.com/docs/build-apps/develop-your-app/extensions/about-extensions.md) in your app's dashboard.
1. Click **Create Extension** in the top right.
1. Find **Conferencing Provider** and click **Create**.
1. Provide the following configuration in the JSON editor and then click **Save**.

    | Name | Type | Description |
    | --- | --- | --- |
    | `deploymentUri` | string | **Required.** Base URI where your implementation is deployed. Wix appends each method path to this base URI. For example, to call Create Conference at `https://my-conferencing.com/v1/create-conference`, the base URI is `https://my-conferencing.com/`. |
    | `displayName` | string | Name shown to users. For example, `Zoom`. |
    | `connectionMethods` | array | Connection methods your provider supports: `OAUTH`, `CREDENTIALS`, or both. Wix calls only the connect methods matching these values. |
    | `updateSupported` | boolean | Whether your provider supports updating conferences. When `false`, Wix doesn't call Update Conference. |
    | `termsUrl`, `privacyUrl`, `iconUrl`, `supportUrl` | string | Terms of service, privacy policy, icon, and support URLs shown to users. |

Define handler functions using [`conferencingProvider.provideHandlers()`](https://dev.wix.com/docs/build-apps/develop-your-app/develop-a-self-managed-app/supported-extensions/backend-extensions/service-plugins/add-self-managed-service-plugin-extensions-with-the-sdk.md):

| Function | Required |
| --- | --- |
| [`createConference()`](https://dev.wix.com/docs/api-reference/business-management/calendar/conferencing/conferencing-provider-v1/create-conference.md) | Yes |
| [`getConference()`](https://dev.wix.com/docs/api-reference/business-management/calendar/conferencing/conferencing-provider-v1/get-conference.md) | Yes |
| [`deleteConference()`](https://dev.wix.com/docs/api-reference/business-management/calendar/conferencing/conferencing-provider-v1/delete-conference.md) | Yes |
| [`listConnections()`](https://dev.wix.com/docs/api-reference/business-management/calendar/conferencing/conferencing-provider-v1/list-connections.md) | Yes |
| [`markConnectionAsDisconnected()`](https://dev.wix.com/docs/api-reference/business-management/calendar/conferencing/conferencing-provider-v1/mark-connection-as-disconnected.md) | Yes |
| [`updateConference()`](https://dev.wix.com/docs/api-reference/business-management/calendar/conferencing/conferencing-provider-v1/update-conference.md) | Only if `updateSupported` is `true` |
| [`connectByOAuth()`](https://dev.wix.com/docs/api-reference/business-management/calendar/conferencing/conferencing-provider-v1/connect-by-o-auth.md) | Only if `connectionMethods` includes `OAUTH` |
| [`connectByCredentials()`](https://dev.wix.com/docs/api-reference/business-management/calendar/conferencing/conferencing-provider-v1/connect-by-credentials.md) | Only if `connectionMethods` includes `CREDENTIALS` |

### Self-hosted: Basic code structure

```js
import { createClient } from '@wix/sdk';
import { conferencingProvider } from '@wix/calendar/service-plugins';

const wixClient = createClient({
  auth: {
    appId: <YOUR_APP_ID>,
    publicKey: <YOUR_APP_PUBLIC_KEY>
  },
  modules: { conferencingProvider }
});

wixClient.conferencingProvider.provideHandlers({
  createConference: async (payload) => {
    const { request, metadata } = payload;

    // Add your logic here
  },
  listConnections: async (payload) => {
    const { request, metadata } = payload;

    // Add your logic here
  },
  // Add the other handlers your provider supports
});

// Implement a router to process all requests
express.post('/plugins-and-webhooks/*', (req, res) => {
  wixClient.process(req);
});
```

**CLI implementations:**

Learn how to [implement a service plugin with the CLI and the SDK](https://dev.wix.com/docs/wix-cli/legacy-clis/legacy-wix-cli-for-apps/supported-extensions/backend-extensions/service-plugins/add-service-plugin-extensions-with-the-cli.md).

Define handler functions using [`conferencingProvider.provideHandlers()`](https://dev.wix.com/docs/build-apps/develop-your-app/develop-a-self-managed-app/supported-extensions/backend-extensions/service-plugins/add-self-managed-service-plugin-extensions-with-the-sdk.md):

| Function | Required |
| --- | --- |
| [`createConference()`](https://dev.wix.com/docs/api-reference/business-management/calendar/conferencing/conferencing-provider-v1/create-conference.md) | Yes |
| [`getConference()`](https://dev.wix.com/docs/api-reference/business-management/calendar/conferencing/conferencing-provider-v1/get-conference.md) | Yes |
| [`deleteConference()`](https://dev.wix.com/docs/api-reference/business-management/calendar/conferencing/conferencing-provider-v1/delete-conference.md) | Yes |
| [`listConnections()`](https://dev.wix.com/docs/api-reference/business-management/calendar/conferencing/conferencing-provider-v1/list-connections.md) | Yes |
| [`markConnectionAsDisconnected()`](https://dev.wix.com/docs/api-reference/business-management/calendar/conferencing/conferencing-provider-v1/mark-connection-as-disconnected.md) | Yes |
| [`updateConference()`](https://dev.wix.com/docs/api-reference/business-management/calendar/conferencing/conferencing-provider-v1/update-conference.md) | Only if `updateSupported` is `true` |
| [`connectByOAuth()`](https://dev.wix.com/docs/api-reference/business-management/calendar/conferencing/conferencing-provider-v1/connect-by-o-auth.md) | Only if `connectionMethods` includes `OAUTH` |
| [`connectByCredentials()`](https://dev.wix.com/docs/api-reference/business-management/calendar/conferencing/conferencing-provider-v1/connect-by-credentials.md) | Only if `connectionMethods` includes `CREDENTIALS` |

### CLI: Basic code structure

```js
import { conferencingProvider } from '@wix/calendar/service-plugins';

conferencingProvider.provideHandlers({
  createConference: async (payload) => {
    const { request, metadata } = payload;

    // Add your logic here
  },
  listConnections: async (payload) => {
    const { request, metadata } = payload;

    // Add your logic here
  },
  // Add the other handlers your provider supports
});
```

:::
::::

## Requirements and constraints

Your implementation should meet the following expectations:

- Respond promptly to every call, since Wix calls your implementation synchronously and waits for the response.
- Be able to look up a connection by `resourceId` and a conference by the `id` you returned from Create Conference.
- Keep your stored connections accurate, since List Connections is Wix's source of truth for connection state.

There are no Wix-imposed rate limits or quotas on this service plugin. Any limits are those of your underlying provider.

### Error handling

Return the defined errors when the matching condition occurs, so Wix can respond appropriately. For example, return the resource-not-connected error when a request targets a resource that has no active connection in your system.

## Before you begin

It's important to note the following points before starting to code:

- Implement only the connect methods that match the `connectionMethods` you advertise. Wix doesn't call a connect method for a connection method you don't advertise.
- Your implementation owns connections and tokens. Wix doesn't persist them, so List Connections must return your current state.
- For OAuth, your implementation owns the full flow: return the OAuth URL, host the provider callback, create the connection, and redirect the user back to Wix's `redirectUrl` with `?connectionId` or `?error`.
- Treat `resourceId` as a stable, opaque key for storing and looking up connections.
- Set `connectedDate` on every connection you store. Wix ignores connections without it.
- When a conference is requested without naming a provider, Wix uses the resource's connection with the most recent `connectedDate`, across all providers on the site.

## Use cases

- [Add a conferencing provider with OAuth](https://dev.wix.com/docs/api-reference/business-management/calendar/conferencing/conferencing-provider-v1/sample-flows.md#add-a-conferencing-provider-with-oauth)
- [Create and manage a conference for a connected resource](https://dev.wix.com/docs/api-reference/business-management/calendar/conferencing/conferencing-provider-v1/sample-flows.md#create-and-manage-a-conference-for-a-connected-resource)

## Terminology

- **Service plugin**: The contract you implement, which Wix calls to connect resources and manage conferences with your provider.
- **Connection**: A link between a resource and an account in your provider. Your implementation stores connections.
- **Connection method**: How a connection is established: `OAUTH` or `CREDENTIALS`.
- **Conference**: A video meeting your provider creates and stores. Wix holds only the details you return.
- **Resource**: The entity a conference is created for. Identified by `resourceId`.
- **Connection status**: `CONNECTED` (usable), `DISCONNECTED` (intentionally disconnected), or `ERROR` (was connected but now broken and needs reconnection).


