# Send Brevo to your agent
Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.
## Fast path
- Download the package from Yavira.
- Extract it into a folder your agent can access.
- Paste one of the prompts below and point your agent at the extracted folder.
## Suggested prompts
### New install

```text
I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete.
```
### Upgrade existing

```text
I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run.
```
## Machine-readable fields
```json
{
  "schemaVersion": "1.0",
  "item": {
    "slug": "brevo",
    "name": "Brevo",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/yujesyoga/brevo",
    "canonicalUrl": "https://clawhub.ai/yujesyoga/brevo",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadUrl": "/downloads/brevo",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=brevo",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "packageFormat": "ZIP package",
    "primaryDoc": "SKILL.md",
    "includedAssets": [
      "SKILL.md"
    ],
    "downloadMode": "redirect",
    "sourceHealth": {
      "source": "tencent",
      "slug": "brevo",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-05-01T01:14:34.357Z",
      "expiresAt": "2026-05-08T01:14:34.357Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=brevo",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=brevo",
        "contentDisposition": "attachment; filename=\"brevo-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null,
        "slug": "brevo"
      },
      "scope": "item",
      "summary": "Item download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this item.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/brevo"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    }
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/brevo",
    "downloadUrl": "https://openagent3.xyz/downloads/brevo",
    "agentUrl": "https://openagent3.xyz/skills/brevo/agent",
    "manifestUrl": "https://openagent3.xyz/skills/brevo/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/brevo/agent.md"
  }
}
```
## Documentation

### Brevo Email Marketing API

Manage contacts, send emails, and automate marketing via Brevo's REST API.

### Authentication

BREVO_KEY=$(cat ~/.config/brevo/api_key)

All requests require header: api-key: $BREVO_KEY

### Base URL

https://api.brevo.com/v3

### Contacts

ActionMethodEndpointCreate contactPOST/contactsGet contactGET/contacts/{email}Update contactPUT/contacts/{email}Delete contactDELETE/contacts/{email}List contactsGET/contacts?limit=50&offset=0Get blacklistedGET/contacts?emailBlacklisted=true

### Lists

ActionMethodEndpointGet all listsGET/contacts/listsCreate listPOST/contacts/listsGet list contactsGET/contacts/lists/{listId}/contactsAdd to listPOST/contacts/lists/{listId}/contacts/addRemove from listPOST/contacts/lists/{listId}/contacts/remove

### Emails

ActionMethodEndpointSend transactionalPOST/smtp/emailSend campaignPOST/emailCampaignsGet templatesGET/smtp/templates

### Create/Update Contact

curl -X POST "https://api.brevo.com/v3/contacts" \\
  -H "api-key: $BREVO_KEY" \\
  -H "Content-Type: application/json" \\
  -d '{
    "email": "user@example.com",
    "listIds": [10],
    "updateEnabled": true,
    "attributes": {
      "NOMBRE": "John",
      "APELLIDOS": "Doe"
    }
  }'

### Get Contact Info

curl "https://api.brevo.com/v3/contacts/user@example.com" \\
  -H "api-key: $BREVO_KEY"

### Update Contact Attributes

curl -X PUT "https://api.brevo.com/v3/contacts/user@example.com" \\
  -H "api-key: $BREVO_KEY" \\
  -H "Content-Type: application/json" \\
  -d '{
    "listIds": [10, 15],
    "attributes": {
      "CUSTOM_FIELD": "value"
    }
  }'

### Send Transactional Email

curl -X POST "https://api.brevo.com/v3/smtp/email" \\
  -H "api-key: $BREVO_KEY" \\
  -H "Content-Type: application/json" \\
  -d '{
    "sender": {"name": "My App", "email": "noreply@example.com"},
    "to": [{"email": "user@example.com", "name": "John"}],
    "subject": "Welcome!",
    "htmlContent": "<p>Hello {{params.name}}</p>",
    "params": {"name": "John"}
  }'

### Send with Template

curl -X POST "https://api.brevo.com/v3/smtp/email" \\
  -H "api-key: $BREVO_KEY" \\
  -H "Content-Type: application/json" \\
  -d '{
    "to": [{"email": "user@example.com"}],
    "templateId": 34,
    "params": {
      "NOMBRE": "John",
      "FECHA": "2026-02-01"
    }
  }'

### List All Contact Lists

curl "https://api.brevo.com/v3/contacts/lists?limit=50" \\
  -H "api-key: $BREVO_KEY"

### Add Contacts to List (Bulk)

curl -X POST "https://api.brevo.com/v3/contacts/lists/10/contacts/add" \\
  -H "api-key: $BREVO_KEY" \\
  -H "Content-Type: application/json" \\
  -d '{
    "emails": ["user1@example.com", "user2@example.com"]
  }'

### Safe Import Pattern

When importing contacts, always respect unsubscribes:

import requests

BREVO_KEY = "your-api-key"
HEADERS = {'api-key': BREVO_KEY, 'Content-Type': 'application/json'}
BASE = 'https://api.brevo.com/v3'

def get_blacklisted():
    """Get all unsubscribed/blacklisted emails"""
    blacklisted = set()
    offset = 0
    while True:
        r = requests.get(
            f'{BASE}/contacts?limit=100&offset={offset}&emailBlacklisted=true',
            headers=HEADERS
        )
        contacts = r.json().get('contacts', [])
        if not contacts:
            break
        for c in contacts:
            blacklisted.add(c['email'].lower())
        offset += 100
    return blacklisted

def safe_import(emails, list_id):
    """Import contacts respecting unsubscribes"""
    blacklisted = get_blacklisted()
    
    for email in emails:
        if email.lower() in blacklisted:
            print(f"Skipped (unsubscribed): {email}")
            continue
        
        r = requests.post(f'{BASE}/contacts', headers=HEADERS, json={
            'email': email,
            'listIds': [list_id],
            'updateEnabled': True
        })
        
        if r.status_code in [200, 201, 204]:
            print(f"Imported: {email}")
        else:
            print(f"Error: {email} - {r.text[:50]}")

### Contact Attributes

Brevo uses custom attributes for contact data:

{
  "attributes": {
    "NOMBRE": "John",
    "APELLIDOS": "Doe",
    "FECHA_ALTA": "2026-01-15",
    "PLAN": "premium",
    "CUSTOM_FIELD": "any value"
  }
}

Create attributes in Brevo dashboard: Contacts → Settings → Contact attributes.

### Response Codes

CodeMeaning200Success (GET)201Created (POST)204Success, no content (PUT/DELETE)400Bad request (check payload)401Invalid API key404Contact/resource not found

### Best Practices

Always check blacklist before importing contacts
Use updateEnabled: true to update existing contacts instead of failing
Use templates for consistent transactional emails
Batch operations when adding many contacts to lists
Store list IDs in config, not hardcoded
Log imports for audit trail

### Automations

Brevo automations trigger on:

Contact added to list
Contact attribute updated
Email opened/clicked
Custom events via API

Trigger automation manually:

curl -X POST "https://api.brevo.com/v3/contacts/import" \\
  -H "api-key: $BREVO_KEY" \\
  -H "Content-Type: application/json" \\
  -d '{
    "listIds": [10],
    "emailBlacklist": false,
    "updateExistingContacts": true,
    "emptyContactsAttributes": false,
    "jsonBody": [
      {"email": "user@example.com", "attributes": {"NOMBRE": "John"}}
    ]
  }'

### Useful Queries

# Count contacts in list
curl "https://api.brevo.com/v3/contacts/lists/10" -H "api-key: $BREVO_KEY" | jq '.totalSubscribers'

# Get recent contacts
curl "https://api.brevo.com/v3/contacts?limit=10&sort=desc" -H "api-key: $BREVO_KEY"

# Check if email exists
curl "https://api.brevo.com/v3/contacts/user@example.com" -H "api-key: $BREVO_KEY"

# Get account info
curl "https://api.brevo.com/v3/account" -H "api-key: $BREVO_KEY"
## Trust
- Source: tencent
- Verification: Indexed source record
- Publisher: yujesyoga
- Version: 1.0.0
## Source health
- Status: healthy
- Item download looks usable.
- Yavira can redirect you to the upstream package for this item.
- Health scope: item
- Reason: direct_download_ok
- Checked at: 2026-05-01T01:14:34.357Z
- Expires at: 2026-05-08T01:14:34.357Z
- Recommended action: Download for OpenClaw
## Links
- [Detail page](https://openagent3.xyz/skills/brevo)
- [Send to Agent page](https://openagent3.xyz/skills/brevo/agent)
- [JSON manifest](https://openagent3.xyz/skills/brevo/agent.json)
- [Markdown brief](https://openagent3.xyz/skills/brevo/agent.md)
- [Download page](https://openagent3.xyz/downloads/brevo)