File: C:/Users/fred/.codex/.tmp/plugins/plugins/zoom/skills/team-chat/references/message-cards.md
# Message Card Components Reference
Complete reference for building rich interactive messages in Zoom Team Chat chatbots.
## Card Structure
Every chatbot message has this structure:
```javascript
{
"content": {
"head": { // Optional header
"text": "Title",
"sub_head": { "text": "Subtitle" }
},
"body": [ // Array of components
{ "type": "message", "text": "Content" },
{ "type": "actions", "items": [...] }
// ... more components
]
}
}
```
## Components Catalog
### Text Components
#### message
Plain text content.
```javascript
{
"type": "message",
"text": "Hello, this is plain text"
}
```
#### header
Title text with optional styling.
```javascript
{
"type": "header",
"text": "Main Heading",
"style": {
"bold": true,
"italic": false
}
}
```
#### styled_text
Text with markdown-like styling.
```javascript
{
"type": "styled_text",
"text": "**Bold** *italic* `code`"
}
```
### Interactive Components
#### actions (Buttons)
Clickable buttons that trigger webhooks.
```javascript
{
"type": "actions",
"items": [
{
"text": "Approve",
"value": "approve",
"style": "Primary" // Primary, Danger, Default
},
{
"text": "Reject",
"value": "reject",
"style": "Danger"
}
]
}
```
**Styles**:
- `Primary` - Blue button
- `Danger` - Red button
- `Default` - Gray button
#### dropdown
Select menu with options.
```javascript
{
"type": "dropdown",
"select_items": [
{ "text": "Option 1", "value": "opt1" },
{ "text": "Option 2", "value": "opt2" }
]
}
```
#### form_field
Text input field.
```javascript
{
"type": "form_field",
"editable": true,
"text": "Enter your name"
}
```
### Layout Components
#### section
Group components with optional colored sidebar.
```javascript
{
"type": "section",
"sidebar_color": "#3b82f6", // Hex color
"sections": [
{ "type": "message", "text": "Grouped content" }
]
}
```
**Common colors**:
- Success: `#10b981` (green)
- Error: `#ef4444` (red)
- Warning: `#f59e0b` (orange)
- Info: `#3b82f6` (blue)
#### fields
Key-value pairs displayed in columns.
```javascript
{
"type": "fields",
"items": [
{ "key": "Status", "value": "Active" },
{ "key": "Priority", "value": "High" },
{ "key": "Assignee", "value": "John Doe" }
]
}
```
#### divider
Horizontal line separator.
```javascript
{
"type": "divider"
}
```
### Media Components
#### attachments
Image with optional link.
```javascript
{
"type": "attachments",
"img_url": "https://example.com/image.jpg",
"resource_url": "https://example.com/full-page",
"information": {
"title": { "text": "Image Title" },
"description": { "text": "Click to view" }
}
}
```
## Complete Examples
### Build Notification
```javascript
{
"content": {
"head": {
"text": "Build #123 Complete",
"sub_head": { "text": "main branch" }
},
"body": [
{
"type": "section",
"sidebar_color": "#10b981",
"sections": [
{ "type": "message", "text": "✅ Build completed successfully" }
]
},
{
"type": "fields",
"items": [
{ "key": "Branch", "value": "main" },
{ "key": "Commit", "value": "abc123" },
{ "key": "Duration", "value": "2m 34s" }
]
},
{
"type": "actions",
"items": [
{ "text": "View Logs", "value": "view_logs", "style": "Primary" },
{ "text": "Deploy", "value": "deploy", "style": "Default" }
]
}
]
}
}
```
### Approval Request
```javascript
{
"content": {
"head": {
"text": "Expense Approval Required"
},
"body": [
{ "type": "message", "text": "John Doe submitted an expense report" },
{
"type": "fields",
"items": [
{ "key": "Amount", "value": "$500.00" },
{ "key": "Category", "value": "Travel" },
{ "key": "Date", "value": "Feb 9, 2026" }
]
},
{ "type": "divider" },
{
"type": "actions",
"items": [
{ "text": "Approve", "value": "approve_500", "style": "Primary" },
{ "text": "Reject", "value": "reject_500", "style": "Danger" },
{ "text": "View Details", "value": "details_500", "style": "Default" }
]
}
]
}
}
```
### Error Notification
```javascript
{
"content": {
"head": {
"text": "⚠️ Service Alert"
},
"body": [
{
"type": "section",
"sidebar_color": "#ef4444",
"sections": [
{ "type": "message", "text": "Database connection failed" }
]
},
{
"type": "fields",
"items": [
{ "key": "Service", "value": "api-prod" },
{ "key": "Error", "value": "Connection timeout" },
{ "key": "Time", "value": "2026-02-09 18:30:00 UTC" }
]
},
{
"type": "actions",
"items": [
{ "text": "View Logs", "value": "logs", "style": "Primary" },
{ "text": "Acknowledge", "value": "ack", "style": "Default" }
]
}
]
}
}
```
## Limitations
| Component | Limit |
|-----------|-------|
| Message text | 4,096 characters |
| Button text | 40 characters |
| Field key/value | 256 characters each |
| Dropdown options | 100 options |
| Buttons per message | 5 buttons |
## Best Practices
### Button Design
✅ **DO**: Use clear, action-oriented labels
- "Approve Request"
- "View Details"
- "Cancel Order"
❌ **DON'T**: Use vague labels
- "OK"
- "Click Here"
- "Button"
### Color Usage
✅ **DO**: Use semantic colors
- Green (`#10b981`) for success
- Red (`#ef4444`) for errors/destructive actions
- Blue (`#3b82f6`) for info
- Orange (`#f59e0b`) for warnings
❌ **DON'T**: Use random colors without meaning
### Field Formatting
✅ **DO**: Keep keys concise, values informative
```javascript
{ "key": "Status", "value": "Active" }
```
❌ **DON'T**: Make keys too long
```javascript
{ "key": "The current status of the request", "value": "Active" }
```
## Testing Cards
Use the [Team Chat App Card Builder](https://appssdk.zoom.us/cardbuilder/) to:
- Preview card designs
- Test layouts
- Generate JSON
## Next Steps
- [Chatbot Setup](../examples/chatbot-setup.md) - Build your first bot
- [Button Actions](../examples/button-actions.md) - Handle button clicks
- [Webhook Events](webhook-events.md) - Understand webhook payloads
## Resources
- [Official Card Components](https://developers.zoom.us/docs/team-chat/customizing-messages/)
- [App Card Builder](https://appssdk.zoom.us/cardbuilder/)
- [Sample Chatbots](https://github.com/zoom?q=chatbot)