Setup and Configuration
1
Prerequisites
Ensure you have the following:
- A Meta Developer Account
- A Meta Business Account
- A valid Facebook account
- ngrok (for development)
- Python 3.7+
2
Create a Meta App
- Go to Meta for Developers and verify your account.
- Create a new app at Meta Apps Dashboard.
- Under "Use Case", select "Other".
- Choose "Business" as the app type.
- Provide:
- App name
- Contact email
 
- Click "Create App".
3
Set Up a Meta Business Account
- Navigate to Meta Business Manager.
- Create a new business account or use an existing one.
- Verify your business by clicking on the email link.
- Go to your App page, navigate to "App settings / Basic", and click "Start Verification" under "Business Verification". Complete the verification process for production.
- Associate the app with your business account and click "Create App".
4
Setup WhatsApp Business API
- Go to your app's WhatsApp Setup page.
- Click on "Start using the API" (API Setup).
- Generate an Access Token.
- Copy your Phone Number ID.
- Copy your WhatsApp Business Account ID.
- Add a "To" number that you will use for testing (this will likely be your personal number).
5
Setup Environment Variables
Create a Ensure this file is sourced by your shell (e.g., by using 
.envrc file in your project root with the following content, replacing placeholder values with your actual credentials:direnv allow).6
Setup Webhook with ngrok
- For local development, use ngrok to expose your local server to the internet. If you don't have a static ngrok URL, you'll need to update the WHATSAPP_WEBHOOK_URLenvironment variable and your Meta App webhook configuration each time ngrok assigns a new URL.
- Run ngrok, ensuring the port matches the port your Agno WhatsApp app will run on (e.g., 8000):
- Copy the https://URL provided by ngrok. This is your base ngrok URL.
- Construct your full webhook URL by appending /webhook(or your chosen prefix) to the ngrok URL (e.g.,https://<random-string>.ngrok-free.app/webhook). UpdateWHATSAPP_WEBHOOK_URLin your.envrcif necessary.
- In your Meta App's WhatsApp Setup page, navigate to the "Webhook" section and click "Edit".
- Configure the webhook:
- Callback URL: Enter your full ngrok webhook URL.
- Verify Token: Enter the same value you used for WHATSAPP_VERIFY_TOKENin your.envrcfile.
 
- Click "Verify and save". Your Agno application must be running locally for verification to succeed.
- After successful verification, click "Manage" next to Webhook fields. Subscribe to the messagesfield underwhatsapp_business_account.
7
Configure Application Environment
Set the 
APP_ENV environment variable:- For Development Mode:
(Webhook signature validation might be less strict or bypassed).
- For Production Mode:
You will also need to set theWHATSAPP_APP_SECRETfor webhook signature validation:This should be the "App Secret" found in your Meta App's "App settings > Basic" page.
Example Usage
Create an agent, wrap it withWhatsappAPI, and serve it:
- Ensure OPENAI_API_KEYenvironment variable is set if using OpenAI models.
- The API will be running (e.g., http://localhost:8000), but interaction is primarily via WhatsApp through the configured webhook.
- API docs (if enabled in settings) might be at http://localhost:8000/docs.
Core Components
- WhatsappAPI: Wraps Agno agents/teams for WhatsApp integration via FastAPI.
- WhatsappAPI.serve: Serves the FastAPI app using Uvicorn, configured for WhatsApp.
WhatsappAPI Class
Main entry point for Agno WhatsApp applications.
Initialization Parameters
| Parameter | Type | Default | Description | 
|---|---|---|---|
| agent | Optional[Agent] | None | Agno Agentinstance. | 
| team | Optional[Team] | None | Agno Teaminstance. | 
| settings | Optional[APIAppSettings] | None | API configuration. Defaults if None. | 
| api_app | Optional[FastAPI] | None | Existing FastAPI app. New one created if None. | 
| router | Optional[APIRouter] | None | Existing APIRouter. New one created if None. | 
| app_id | Optional[str] | None | App identifier (autogenerated if not set). | 
| name | Optional[str] | None | Name for the App. | 
| description | Optional[str] | None | Description for the App. | 
agent or team, not both.
Key Method
| Method | Parameters | Return Type | Description | 
|---|---|---|---|
| get_app | use_async: bool = Trueprefix: str = "" | FastAPI | Returns configured FastAPI app. Sets prefix, error handlers, and includes WhatsApp routers. Async router is used by default. | 
Endpoints
Endpoints are accessible at theprefix (default is root level: "").
1. GET /webhook
- Description: Verifies WhatsApp webhook (challenge).
- Responses:
- 200 OK: Returns- hub.challengeif tokens match.
- 403 Forbidden: Token mismatch or invalid mode.
- 500 Internal Server Error:- WHATSAPP_VERIFY_TOKENnot set.
 
2. POST /webhook
- Description: Receives incoming WhatsApp messages and events.
- Processing:
- Validates signature (if APP_ENV="production"andWHATSAPP_APP_SECRETis set).
- Processes messages (text, image, video, audio, document) via agent.arun()orteam.arun().
- Sends replies via WhatsApp.
 
- Validates signature (if 
- Responses:
- 200 OK:- {"status": "processing"}or- {"status": "ignored"}.
- 403 Forbidden: Invalid signature.
- 500 Internal Server Error: Other processing errors.
 
Parameters
| Parameter | Type | Default | Description | 
|---|---|---|---|
| app | Union[str, FastAPI] | N/A | FastAPI app instance or import string (Required). | 
| host | str | "localhost" | Host to bind. | 
| port | int | 7777 | Port to bind. | 
| reload | bool | False | Enable auto-reload for development. |