Zoom auth provider
The Zoom auth provider enables tools and agents to call the Zoom API on behalf of a user. Behind the scenes, the Arcade Engine and the Zoom auth provider seamlessly manage Zoom OAuth 2.0 authorization for your users.
What's documented here
This page describes how to use and configure Zoom auth with Arcade AI.
This auth provider is used by:
- Your app code that needs to call Zoom APIs
- Or, your custom tools that need to call Zoom APIs
Configuring Zoom auth
How you configure the Zoom auth provider depends on whether you use the Arcade Cloud Engine or a self-hosted Engine.
With the Arcade Cloud Engine, you can start building and testing Zoom auth without any configuration. Your users will see Arcade AI demo
as the name of the application that's requesting permission.
When you are ready to go to production, you'll want to configure the Zoom auth provider with your own Zoom app credentials, so users see your app name when they authorize access.
Create a Zoom app
- Follow Zoom's guide to registering an app (opens in a new tab) on the Zoom marketplace
- Set the redirect URL to:
https://cloud.arcade-ai.com/api/v1/oauth/callback
and enable Strict Mode - Enable the Zoom features and permissions (scopes) that your app needs
- Copy the client ID and client secret
Configuring Zoom auth with the Arcade Cloud Engine
Coming soon! In 0.1.0-preview, the Arcade Cloud Engine does not yet support configuring auth providers.
Configuring Zoom auth with a self-hosted Arcade Engine
Set environment variables
Set the following environment variables:
export ZOOM_CLIENT_ID="<your client ID>"
export ZOOM_CLIENT_SECRET="<your client secret>"
Or, you can set these values in a .env
file:
ZOOM_CLIENT_ID="<your client ID>"
ZOOM_CLIENT_SECRET="<your client secret>"
See Engine configuration for more information on how to set environment variables and configure the Arcade Engine.
Edit the Engine configuration
Edit the engine.yaml
file and add a zoom
item to the auth.providers
section:
auth:
providers:
- id: zoom
client_id: ${env:ZOOM_CLIENT_ID}
client_secret: ${env:ZOOM_CLIENT_SECRET}
Using Zoom auth in app code
Use the Zoom auth provider in your own agents and AI apps to get a user token for the Zoom API. See authorizing agents with Arcade to understand how this works.
Use client.auth.start()
to get a user token for the Zoom API:
from arcadepy import Arcade
client = Arcade() # Automatically finds the `ARCADE_API_KEY` env variable
user_id = "[email protected]"
# Start the authorization process
auth_response = client.auth.start(
user_id=user_id,
provider="zoom",
scopes=["meeting:read:list_upcoming_meetings"],
)
if auth_response.status != "completed":
print("Please complete the authorization challenge in your browser:")
print(auth_response.authorization_url)
# Wait for the authorization to complete
auth_response = client.auth.wait_for_completion(auth_response)
token = auth_response.context.token
# Do something interesting with the token...
Using Zoom auth in custom tools
The Arcade LLM API is a convenient way to call LLMs and automatically invoke tools. You can author your own custom tools that interact with the Zoom API.
Use the Zoom()
auth class to specify that a tool requires authorization with Zoom. The context.authorization.token
field will be automatically populated with the user's Zoom token:
from typing import Annotated, Optional
import httpx
from arcade.sdk import ToolContext, tool
from arcade.sdk.auth import Zoom
@tool(
requires_auth=Zoom(
scopes=["meeting:read:list_upcoming_meetings"],
)
)
async def list_upcoming_meetings(
context: ToolContext,
user_id: Annotated[
Optional[str],
"The user's user ID or email address. Defaults to 'me' for the current user.",
] = "me",
) -> Annotated[dict, "List of upcoming meetings within the next 24 hours"]:
"""List a Zoom user's upcoming meetings within the next 24 hours."""
url = f"https://api.zoom.us/v2/users/{user_id}/upcoming_meetings"
headers = {"Authorization": f"Bearer {context.authorization.token}"}
async with httpx.AsyncClient() as client:
response = await client.get(url, headers=headers)
response.raise_for_status()
return response.json()