> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.vapi.ai/llms.txt.
> For full documentation content, see https://docs.vapi.ai/llms-full.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.vapi.ai/_mcp/server.

# Property management routing squad

> Build a property management Squad with a router assistant plus maintenance and leasing specialists for accurate transfers.

## Overview

Replace visual flows with a Squad: a Router assistant classifies the inquiry and transfers to Maintenance or Leasing specialists. Use a dynamic transfer tool for human escalation.

**Squad Capabilities:**

* Tenant verification and inquiry classification
* Maintenance vs leasing specialist assistants
* Human transfer with warm summary when needed

## 1. Define members

```json title="Example squad payload"
{
  "members": [
    { "assistant": { "name": "Router", "model": {"provider": "openai", "model": "gpt-4o", "messages": [{"role": "system", "content": "Classify tenant inquiries: emergency, maintenance, leasing, rent, general. Transfer accordingly."}] }, "toolIds": ["TENANT_LOOKUP_ID"], "firstMessage": "Thanks for calling. How can I help?", "firstMessageMode": "assistant-speaks-first" } },
    { "assistant": { "name": "Maintenance", "model": {"provider": "openai", "model": "gpt-4o", "messages": [{"role": "system", "content": "Maintenance specialist. Collect details and prioritize emergencies."}] } } },
    { "assistant": { "name": "Leasing", "model": {"provider": "openai", "model": "gpt-4o", "messages": [{"role": "system", "content": "Leasing specialist. Answer leasing and rent questions."}] } } }
  ]
}
```

## 2. Transfers and escalation

* Router → Maintenance for emergency/maintenance
* Router → Leasing for leasing/rent/general
* Dynamic transfer tool for human dispatch

## 3. Implement

```typescript
import { VapiClient } from "@vapi-ai/server-sdk";
const vapi = new VapiClient({ token: process.env.VAPI_API_KEY! });

await vapi.calls.create({
  transport: { type: "web" },
  squad: {
    members: [
      { assistant: { name: "Router", model: { provider: "openai", model: "gpt-4o", messages: [{ role: "system", content: "Classify tenant inquiries: emergency, maintenance, leasing, rent, general. Transfer accordingly." }] }, firstMessage: "Thanks for calling. How can I help?", firstMessageMode: "assistant-speaks-first" } },
      { assistant: { name: "Maintenance", model: { provider: "openai", model: "gpt-4o", messages: [{ role: "system", content: "Maintenance specialist. Collect details and prioritize emergencies." }] } } },
      { assistant: { name: "Leasing", model: { provider: "openai", model: "gpt-4o", messages: [{ role: "system", content: "Leasing specialist. Answer leasing and rent questions." }] } } }
    ],
  },
});
```

```python
import os
from vapi import Vapi

client = Vapi(token=os.getenv("VAPI_API_KEY"))
client.calls.create(
    transport={"type": "web"},
    squad={
        "members": [
            {"assistant": {"name": "Router", "model": {"provider": "openai", "model": "gpt-4o", "messages": [{"role": "system", "content": "Classify tenant inquiries: emergency, maintenance, leasing, rent, general. Transfer accordingly."}]}, "first_message": "Thanks for calling. How can I help?", "first_message_mode": "assistant-speaks-first"}},
            {"assistant": {"name": "Maintenance", "model": {"provider": "openai", "model": "gpt-4o", "messages": [{"role": "system", "content": "Maintenance specialist. Collect details and prioritize emergencies."}]}}},
            {"assistant": {"name": "Leasing", "model": {"provider": "openai", "model": "gpt-4o", "messages": [{"role": "system", "content": "Leasing specialist. Answer leasing and rent questions."}]}}},
        ]
    },
)
```

```bash
curl -X POST "https://api.vapi.ai/call/web" \
  -H "Authorization: Bearer $VAPI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "squad": {
      "members": [
        { "assistant": { "name": "Router", "model": {"provider": "openai", "model": "gpt-4o", "messages": [{"role": "system", "content": "Classify tenant inquiries: emergency, maintenance, leasing, rent, general. Transfer accordingly."}] }, "firstMessage": "Thanks for calling. How can I help?", "firstMessageMode": "assistant-speaks-first" } },
        { "assistant": { "name": "Maintenance", "model": {"provider": "openai", "model": "gpt-4o", "messages": [{"role": "system", "content": "Maintenance specialist. Collect details and prioritize emergencies."}] } } },
        { "assistant": { "name": "Leasing", "model": {"provider": "openai", "model": "gpt-4o", "messages": [{"role": "system", "content": "Leasing specialist. Answer leasing and rent questions."}] } } }
      ]
    }
  }'
```

## 4. Test

Assign the Squad to a phone number and test each path.

## Next steps

* **Dynamic transfers**: [How to build](/calls/call-dynamic-transfers)